From: Mu-Woong Lee Date: Tue, 19 Apr 2016 11:02:53 +0000 (+0900) Subject: Reorganize the directory structure of source files X-Git-Tag: submit/tizen/20160503.015801^2~22 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F56%2F66556%2F1;p=platform%2Fcore%2Fcontext%2Fcontext-provider.git Reorganize the directory structure of source files Source directories are roughly separated by their dependencies. Later, the build script will be updated to produce one shared object per one directory, and a dynamic loading routine will be applied. Change-Id: Iceaae6740cebc15a89ce0631f13b1254640b12c4 Signed-off-by: Mu-Woong Lee --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 913174a..2865cfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,9 +11,6 @@ INCLUDE_DIRECTORIES( ADD_DEFINITIONS(-O2 -Wall -fPIC -fdata-sections -ffunction-sections -fvisibility=hidden) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIC -Wl,--as-needed -Wl,--gc-section -Wl,--print-gc-section") -# Base Dependency -SET(dependencies libcontext-server) - # Profiles IF("${PROFILE}" STREQUAL "mobile") ADD_DEFINITIONS("-D_MOBILE_") @@ -23,23 +20,70 @@ IF("${PROFILE}" STREQUAL "wearable") ADD_DEFINITIONS("-D_WEARABLE_") ENDIF("${PROFILE}" STREQUAL "wearable") -IF("${PROFILE}" STREQUAL "tv") - ADD_DEFINITIONS("-D_TV_") -ENDIF("${PROFILE}" STREQUAL "tv") -# Include Sub-modules -ADD_SUBDIRECTORY(src) -MESSAGE("Compile definitions: ${compile_defs}") +# Dependency & Source +SET(DEPS + libcontext-server + vconf + capi-system-info + capi-system-device + capi-system-runtime-info + capi-appfw-package-manager + capi-appfw-application + capi-appfw-app-manager + pkgmgr + pkgmgr-info + capi-media-sound-manager + capi-network-bluetooth + capi-network-wifi + motion +) + +FILE(GLOB SRCS + src/shared/*.cpp + src/time/*.cpp + src/activity/*.cpp + src/app-stats/*.cpp + src/headphone/*.cpp + src/system/*.cpp + src/wifi/*.cpp +) + +IF("${PROFILE}" STREQUAL "mobile") +SET(DEPS ${DEPS} + msg-service + contacts-service2 + tapi + capi-telephony + capi-messaging-email + capi-content-media-content + capi-location-manager + capi-geofence-manager +) + +FILE(GLOB SRCS ${SRCS} + src/call/*.cpp + src/contacts/*.cpp + src/email/*.cpp + src/geofence/*.cpp + src/media-stats/*.cpp + src/message/*.cpp + src/my-place/*.cpp + src/my-place/user_places/*.cpp + src/social-stats/*.cpp +) +ENDIF("${PROFILE}" STREQUAL "mobile") + # Build INCLUDE(FindPkgConfig) -PKG_CHECK_MODULES(DEPS REQUIRED ${dependencies}) +PKG_CHECK_MODULES(DEPS REQUIRED ${DEPS}) FOREACH(flag ${DEPS_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -ADD_LIBRARY(${target} STATIC ${sources}) +ADD_LIBRARY(${target} STATIC ${SRCS}) TARGET_LINK_LIBRARIES(${target} ${DEPS_LDFLAGS}) SET_TARGET_PROPERTIES(${target} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) SET_TARGET_PROPERTIES(${target} PROPERTIES COMPILE_DEFINITIONS "${compile_defs}") @@ -47,7 +91,7 @@ SET_TARGET_PROPERTIES(${target} PROPERTIES SOVERSION ${MAJORVER}) SET_TARGET_PROPERTIES(${target} PROPERTIES VERSION ${FULLVER}) # Package Config -FOREACH(item IN LISTS dependencies) +FOREACH(item IN LISTS DEPS) SET(deps_str "${deps_str} ${item}") ENDFOREACH(item) @@ -74,4 +118,4 @@ INSTALL( FILES_MATCHING PATTERN "*.h" ) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) -INSTALL(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT RuntimeLibraries) +INSTALL(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/packaging/context-provider.spec b/packaging/context-provider.spec index 7068f1e..598eb65 100644 --- a/packaging/context-provider.spec +++ b/packaging/context-provider.spec @@ -9,6 +9,10 @@ Source0: %{name}-%{version}.tar.gz %define BUILD_PROFILE %{?profile}%{!?profile:%{?tizen_profile_name}} %define keepstatic 1 +%if "%{?BUILD_PROFILE}" == "tv" +ExcludeArch: %{arm} aarch64 %ix86 x86_64 +%endif + BuildRequires: cmake BuildRequires: pkgconfig(libcontext-server) @@ -22,36 +26,21 @@ BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(capi-media-sound-manager) - -%if "%{?BUILD_PROFILE}" == "mobile" BuildRequires: pkgconfig(capi-network-bluetooth) BuildRequires: pkgconfig(capi-network-wifi) -BuildRequires: pkgconfig(capi-telephony) -BuildRequires: pkgconfig(tapi) -BuildRequires: pkgconfig(msg-service) -BuildRequires: pkgconfig(capi-messaging-email) BuildRequires: pkgconfig(motion) + +%if "%{?BUILD_PROFILE}" == "mobile" +BuildRequires: pkgconfig(msg-service) BuildRequires: pkgconfig(contacts-service2) +BuildRequires: pkgconfig(tapi) +BuildRequires: pkgconfig(capi-telephony) +BuildRequires: pkgconfig(capi-messaging-email) BuildRequires: pkgconfig(capi-content-media-content) BuildRequires: pkgconfig(capi-location-manager) BuildRequires: pkgconfig(capi-geofence-manager) %endif -%if "%{?BUILD_PROFILE}" == "wearable" -BuildRequires: pkgconfig(capi-network-bluetooth) -BuildRequires: pkgconfig(capi-network-wifi) -BuildRequires: pkgconfig(capi-telephony) -BuildRequires: pkgconfig(tapi) -BuildRequires: pkgconfig(msg-service) -BuildRequires: pkgconfig(motion) -%endif - -%if "%{?BUILD_PROFILE}" == "tv" -BuildRequires: pkgconfig(capi-network-bluetooth) -BuildRequires: pkgconfig(capi-network-wifi) -BuildRequires: pkgconfig(capi-content-media-content) -%endif - %description Context Provider diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 5926ed8..0000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) - -FUNCTION(add_provider prvd_name) - ADD_SUBDIRECTORY(${prvd_name}) - GET_DIRECTORY_PROPERTY(srcs_subdir DIRECTORY ${prvd_name} DEFINITION prvd_srcs) - GET_DIRECTORY_PROPERTY(deps_subdir DIRECTORY ${prvd_name} DEFINITION prvd_deps) - GET_DIRECTORY_PROPERTY(cdef_subdir DIRECTORY ${prvd_name} DEFINITION prvd_cdef) - SET(srcs_collected ${srcs_collected} ${srcs_subdir} PARENT_SCOPE) - SET(deps_collected ${deps_collected} ${deps_subdir} PARENT_SCOPE) - SET(cdef_collected ${cdef_collected} ${cdef_subdir} PARENT_SCOPE) -ENDFUNCTION(add_provider) - - -add_provider(device) -add_provider(statistics) -add_provider(place) -#add_provider(custom) - - -LIST(REMOVE_DUPLICATES deps_collected) - -SET(sources ${sources} ${srcs_collected} PARENT_SCOPE) -SET(dependencies ${dependencies} ${deps_collected} PARENT_SCOPE) -SET(compile_defs ${compile_defs} ${cdef_collected} PARENT_SCOPE) diff --git a/src/activity/Activity.h b/src/activity/Activity.h new file mode 100644 index 0000000..ab5be2e --- /dev/null +++ b/src/activity/Activity.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 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 _DEVICE_ACTIVITY_STATUS_H_ +#define _DEVICE_ACTIVITY_STATUS_H_ + +#include "ActivityBase.h" +#include "ActivityTypes.h" + +#define GENERATE_ACTIVITY_PROVIDER(actPrvd, actSubj, actType) \ + class actPrvd : public UserActivityBase { \ + public: \ + actPrvd() : UserActivityBase(actSubj, actType) {} \ + }; \ + +namespace ctx { + GENERATE_ACTIVITY_PROVIDER(UserActivityStationary, USER_ACT_SUBJ_STATIONARY, ACTIVITY_STATIONARY); + GENERATE_ACTIVITY_PROVIDER(UserActivityWalking, USER_ACT_SUBJ_WALKING, ACTIVITY_WALK); + GENERATE_ACTIVITY_PROVIDER(UserActivityRunning, USER_ACT_SUBJ_RUNNING, ACTIVITY_RUN); + GENERATE_ACTIVITY_PROVIDER(UserActivityInVehicle, USER_ACT_SUBJ_IN_VEHICLE, ACTIVITY_IN_VEHICLE); +} + +#endif // _DEVICE_ACTIVITY_STATUS_H_ diff --git a/src/activity/ActivityBase.cpp b/src/activity/ActivityBase.cpp new file mode 100644 index 0000000..4abda04 --- /dev/null +++ b/src/activity/ActivityBase.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "ActivityTypes.h" +#include "ActivityBase.h" + +using namespace ctx; + +UserActivityBase::UserActivityBase(const char *subject, activity_type_e type) : + DeviceProviderBase(subject), + __activityType(type), + __activityHandle(NULL) +{ +} + +UserActivityBase::~UserActivityBase() +{ + if (__activityHandle) + activity_release(__activityHandle); +} + +bool UserActivityBase::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/sensor.activity_recognition"); +} + +void UserActivityBase::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE, + "{\"Event\":{\"type\":\"string\", \"values\":[\"Detected\"]}}", + "{\"Accuracy\":{\"type\":\"string\", \"values\":[\"Low\", \"Normal\", \"High\"]}}" + ); +} + +void UserActivityBase::__updateCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void* userData) +{ + IF_FAIL_VOID_TAG(error == ACTIVITY_ERROR_NONE, _E, "Error: %d", error); + + UserActivityBase *instance = static_cast(userData); + instance->__handleUpdate(activity, data, timestamp); +} + +void UserActivityBase::__handleUpdate(activity_type_e activity, const activity_data_h data, double timestamp) +{ + IF_FAIL_VOID_TAG(activity == __activityType, _E, "Invalid activity: %d", activity); + + Json dataRead; + dataRead.set(NULL, USER_ACT_EVENT, USER_ACT_DETECTED); + + activity_accuracy_e accuracy = ACTIVITY_ACCURACY_LOW; + activity_get_accuracy(data, &accuracy); + + switch (accuracy) { + case ACTIVITY_ACCURACY_HIGH: + dataRead.set(NULL, USER_ACT_ACCURACY, USER_ACT_HIGH); + break; + case ACTIVITY_ACCURACY_MID: + dataRead.set(NULL, USER_ACT_ACCURACY, USER_ACT_NORMAL); + break; + default: + dataRead.set(NULL, USER_ACT_ACCURACY, USER_ACT_LOW); + break; + } + + publish(NULL, ERR_NONE, dataRead); +} + +int UserActivityBase::subscribe() +{ + IF_FAIL_RETURN(__activityHandle == NULL, ERR_NONE); + + activity_create(&__activityHandle); + IF_FAIL_RETURN_TAG(__activityHandle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); + + int ret = activity_start_recognition(__activityHandle, __activityType, __updateCb, this); + if (ret != ACTIVITY_ERROR_NONE) { + _E("Recognition starting failed"); + activity_release(__activityHandle); + __activityHandle = NULL; + return ERR_OPERATION_FAILED; + } + + return ERR_NONE; +} + +int UserActivityBase::unsubscribe() +{ + IF_FAIL_RETURN(__activityHandle, ERR_NONE); + + activity_stop_recognition(__activityHandle); + activity_release(__activityHandle); + __activityHandle = NULL; + + return ERR_NONE; +} diff --git a/src/activity/ActivityBase.h b/src/activity/ActivityBase.h new file mode 100644 index 0000000..56b709f --- /dev/null +++ b/src/activity/ActivityBase.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015 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 _DEVICE_ACTIVITY_STATUS_BASE_H_ +#define _DEVICE_ACTIVITY_STATUS_BASE_H_ + +#include +#include +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class UserActivityBase : public DeviceProviderBase { + public: + UserActivityBase(const char *subject, activity_type_e type); + virtual ~UserActivityBase(); + + int subscribe(); + int unsubscribe(); + + bool isSupported(); + void submitTriggerItem(); + + protected: + activity_type_e __activityType; + activity_h __activityHandle; + + private: + void __handleUpdate(activity_type_e activity, const activity_data_h data, double timestamp); + static void __updateCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void* userData); + }; + +} + +#endif // _DEVICE_ACTIVITY_STATUS_BASE_H_ diff --git a/src/activity/ActivityTypes.h b/src/activity/ActivityTypes.h new file mode 100644 index 0000000..4562b7b --- /dev/null +++ b/src/activity/ActivityTypes.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 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 _DEVICE_ACTIVITY_STATUS_TYPES_H_ +#define _DEVICE_ACTIVITY_STATUS_TYPES_H_ + +// Subject +#define USER_ACT_SUBJ_IN_VEHICLE "activity/in_vehicle" +#define USER_ACT_SUBJ_RUNNING "activity/running" +#define USER_ACT_SUBJ_STATIONARY "activity/stationary" +#define USER_ACT_SUBJ_WALKING "activity/walking" + +// Data Key +#define USER_ACT_EVENT "Event" +#define USER_ACT_ACCURACY "Accuracy" + +// Data Value +#define USER_ACT_DETECTED "Detected" +#define USER_ACT_LOW "Low" +#define USER_ACT_NORMAL "Normal" +#define USER_ACT_HIGH "High" + +#endif // _DEVICE_ACTIVITY_STATUS_TYPES_H_ diff --git a/src/app-stats/ActiveWindowMonitor.cpp b/src/app-stats/ActiveWindowMonitor.cpp new file mode 100644 index 0000000..c8d3120 --- /dev/null +++ b/src/app-stats/ActiveWindowMonitor.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include + +#include +#include +#include "../shared/SystemInfo.h" +#include "AppStatisticsTypes.h" +#include "ActiveWindowMonitor.h" + +/* Active window changes frequently. + * We thus consider the apps being foregrounded at least 3 secs */ +#define ONE_DAY_IN_SEC 86400 + +ctx::AppUseMonitor::AppUseMonitor() : + __signalId(-1), + __lastCleanupTime(0), + __dbusWatcher(DBusType::SYSTEM) +{ + __startLogging(); +} + +ctx::AppUseMonitor::~AppUseMonitor() +{ + __stopLogging(); +} + +bool ctx::AppUseMonitor::__startLogging() +{ + __signalId = __dbusWatcher.watch(NULL, "/Org/Tizen/Aul/AppStatus", "org.tizen.aul.AppStatus", "AppStatusChange", this); + _D("Active window monitoring started (%lld)", __signalId); + return (__signalId > 0); +} + +void ctx::AppUseMonitor::__stopLogging() +{ + if (__signalId > 0) { + __dbusWatcher.unwatch(__signalId); + _D("Active window monitoring stopped"); + } +} + +void ctx::AppUseMonitor::onSignal(const char* sender, const char* path, const char* iface, const char* name, GVariant* param) +{ + gint pid = 0; + const gchar *appId = NULL; + const gchar *pkgId = NULL; + const gchar *status = NULL; + const gchar *type = NULL; + + g_variant_get(param, "(i&s&s&s&s)", &pid, &appId, &pkgId, &status, &type); + _D("AppEvent: %s, %s, %s", appId, status, type); + + IF_FAIL_VOID(appId && status && type); + IF_FAIL_VOID(STR_EQ(type, "uiapp") && !__isSkippable(appId)); + + if (STR_EQ(status, "fg")) { + __createRecord(appId); + } else if (STR_EQ(status, "bg")) { + __finishRecord(appId); + __removeExpired(); + } +} + +void ctx::AppUseMonitor::__createRecord(std::string appId) +{ + int audioJack; + int systemVolume; + int mediaVolume; + std::string bssid; + Json data; + data.set(NULL, STATS_APP_ID, appId); + + if (ctx::system_info::getAudioJackState(&audioJack)) + data.set(NULL, STATS_AUDIO_JACK, audioJack); + + if (ctx::system_info::getVolume(&systemVolume, &mediaVolume)) { + data.set(NULL, STATS_SYSTEM_VOLUME, systemVolume); + data.set(NULL, STATS_MEDIA_VOLUME, mediaVolume); + } + + if (ctx::system_info::getWifiBssid(bssid)) + data.set(NULL, STATS_BSSID, bssid); + + __dbManager.insert(0, APP_TABLE_USAGE_LOG, data, NULL); +} + +void ctx::AppUseMonitor::__finishRecord(std::string appId) +{ + /* TODO: It might be necessary to update system status here */ + std::stringstream query; + query << + "UPDATE " APP_TABLE_USAGE_LOG \ + " SET " STATS_DURATION " = strftime('%s', 'now') - " STATS_UNIV_TIME \ + " WHERE " STATS_COL_ROW_ID " = (" \ + "SELECT MAX(" STATS_COL_ROW_ID ") FROM " APP_TABLE_USAGE_LOG \ + " WHERE " STATS_APP_ID " = '" << appId << "'" \ + " AND " STATS_DURATION " = 0)"; + __dbManager.execute(0, query.str().c_str(), NULL); +} + +bool ctx::AppUseMonitor::__isSkippable(std::string appId) +{ + /* TODO: circular cache */ + app_info_h appInfo = NULL; + int err = app_manager_get_app_info(appId.c_str(), &appInfo); + IF_FAIL_RETURN_TAG(err == APP_MANAGER_ERROR_NONE && appInfo, true, _E, "app_manager_get_app_info() failed"); + + bool nodisp = false; + err = app_info_is_nodisplay(appInfo, &nodisp); + if (err != APP_MANAGER_ERROR_NONE) { + app_info_destroy(appInfo); + _E("app_info_is_nodisplay() failed"); + return true; + } + + app_info_destroy(appInfo); + return nodisp; +} + +void ctx::AppUseMonitor::__removeExpired() +{ + int timestamp = static_cast(time(NULL)); + IF_FAIL_VOID(timestamp - __lastCleanupTime >= ONE_DAY_IN_SEC); + + __lastCleanupTime = timestamp; + + std::stringstream query; + query << "DELETE FROM " APP_TABLE_USAGE_LOG " WHERE " \ + STATS_UNIV_TIME " < strftime('%s', 'now') - " << LOG_RETENTION_PERIOD; + __dbManager.execute(0, query.str().c_str(), NULL); +} diff --git a/src/app-stats/ActiveWindowMonitor.h b/src/app-stats/ActiveWindowMonitor.h new file mode 100644 index 0000000..64f0d34 --- /dev/null +++ b/src/app-stats/ActiveWindowMonitor.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_APP_USE_MONITOR_H_ +#define _CONTEXT_STATS_APP_USE_MONITOR_H_ + +#include +#include +#include +#include + +namespace ctx { + + class AppUseMonitor : public IDBusSignalListener { + private: + int64_t __signalId; + int __lastCleanupTime; + DBusSignalWatcher __dbusWatcher; + DatabaseManager __dbManager; + + bool __startLogging(void); + void __stopLogging(void); + + bool __isSkippable(std::string appId); + void __createRecord(std::string appId); + void __finishRecord(std::string appId); + void __removeExpired(); + void onSignal(const char *sender, const char *path, const char *iface, const char *name, GVariant *param); + + public: + AppUseMonitor(); + ~AppUseMonitor(); + }; /* class AppUseMonitor */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_STATS_APP_USE_MONITOR_H_ */ diff --git a/src/app-stats/AppStatisticsTypes.h b/src/app-stats/AppStatisticsTypes.h new file mode 100644 index 0000000..42b049e --- /dev/null +++ b/src/app-stats/AppStatisticsTypes.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_APP_TYPES_H_ +#define _CONTEXT_STATS_APP_TYPES_H_ + +#include "../shared/CommonTypes.h" + +#define APP_HISTORY_PRIV "apphistory.read" +#define APP_SUBJ_LOGGER "stats/app/logger" +#define APP_SUBJ_RECENTLY_USED "stats/app/recently" +#define APP_SUBJ_FREQUENTLY_USED "stats/app/often" +#define APP_SUBJ_RARELY_USED "stats/app/rarely" +#define APP_SUBJ_PEAK_TIME "stats/app/peak_time" +#define APP_SUBJ_COMMON_SETTING "stats/app/setting" +#define APP_SUBJ_FREQUENCY "stats/app/frequency" + +#define APP_TABLE_REMOVABLE_APP "Log_RemovableApp" +#define APP_TABLE_REMOVABLE_APP_COLUMNS \ + "AppId TEXT NOT NULL UNIQUE" + +#define APP_TABLE_USAGE_LOG "Log_AppLaunch" +#define APP_TABLE_USAGE_LOG_COLUMNS \ + "AppId TEXT NOT NULL, Duration INTEGER NOT NULL DEFAULT 0, " \ + "SystemVolume INTEGER, MediaVolume INTEGER, AudioJack INTEGER, " \ + "BSSID TEXT, " \ + "UTC TIMESTAMP DEFAULT (strftime('%s', 'now')), " \ + "LocalTime TIMESTAMP DEFAULT (strftime('%s', 'now', 'localtime'))" + +#define APP_TEMP_USAGE_FREQ "Temp_AppLaunchFreq" +#define APP_TEMP_USAGE_FREQ_SQL \ + "CREATE TABLE IF NOT EXISTS " APP_TEMP_USAGE_FREQ \ + " (AppId TEXT NOT NULL UNIQUE, TotalCount INTEGER DEFAULT 0);" + +#endif /* End of _CONTEXT_STATS_APP_TYPES_H_ */ diff --git a/src/app-stats/AppStatsLogger.cpp b/src/app-stats/AppStatsLogger.cpp new file mode 100644 index 0000000..9bbb390 --- /dev/null +++ b/src/app-stats/AppStatsLogger.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "AppStatisticsTypes.h" +#include "AppStatsLogger.h" + +using namespace ctx; + +AppStatsLogger::AppStatsLogger() : + ContextProvider(APP_SUBJ_LOGGER), + __initializer(NULL), + __installMon(NULL), + __launchMon(NULL) +{ + __initializer = new(std::nothrow) AppDbInitializer(); + IF_FAIL_VOID_TAG(__initializer, _E, "Memory allocation failed"); + + __installMon = new(std::nothrow) AppInstallMonitor(); + __launchMon = new(std::nothrow) AppUseMonitor(); + IF_FAIL_CATCH_TAG(__installMon && __launchMon, _E, "Memory allocation failed"); + return; + +CATCH: + delete __installMon; + delete __launchMon; + __installMon = NULL; + __launchMon = NULL; +} + +AppStatsLogger::~AppStatsLogger() +{ + delete __installMon; + delete __launchMon; +} + +int AppStatsLogger::subscribe(Json option, Json* requestResult) +{ + return ERR_NONE; +} + +int AppStatsLogger::unsubscribe(Json option) +{ + return ERR_NONE; +} diff --git a/src/app-stats/AppStatsLogger.h b/src/app-stats/AppStatsLogger.h new file mode 100644 index 0000000..b2104dd --- /dev/null +++ b/src/app-stats/AppStatsLogger.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_APP_STATS_LOGGER_H_ +#define _CONTEXT_APP_STATS_LOGGER_H_ + +#include +#include "DbInit.h" +#include "InstallMonitor.h" +#include "ActiveWindowMonitor.h" + +namespace ctx { + + class AppStatsLogger : public ContextProvider { + public: + AppStatsLogger(); + ~AppStatsLogger(); + + int subscribe(Json option, Json *requestResult); + int unsubscribe(Json option); + + void submitTriggerItem() {} + + private: + AppDbInitializer *__initializer; + AppInstallMonitor *__installMon; + AppUseMonitor *__launchMon; + }; + +} /* namespace ctx */ + +#endif /* _CONTEXT_APP_STATS_LOGGER_H_ */ diff --git a/src/app-stats/AppStatsProvider.cpp b/src/app-stats/AppStatsProvider.cpp new file mode 100644 index 0000000..7e18049 --- /dev/null +++ b/src/app-stats/AppStatsProvider.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "AppStatsProvider.h" +#include "DbHandle.h" + +using namespace ctx; + +AppStatsProvider::AppStatsProvider(const char *subject) : + ContextProvider(subject) +{ +} + +AppStatsProvider::~AppStatsProvider() +{ +} + +void AppStatsProvider::submitTriggerItem() +{ +} + +int AppStatsProvider::read(Json option, Json *requestResult) +{ + AppDbHandle *handle = new(std::nothrow) AppDbHandle(this); + IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); + + int err = handle->read(option); + if (err != ERR_NONE) { + delete handle; + return err; + } + + return ERR_NONE; +} + +void AppFreqProvider::submitTriggerItem() +{ + registerTriggerItem(OPS_READ, + "{" TRIG_DEF_RANK "," TRIG_DEF_TOTAL_COUNT "}", + "{" + "\"AppId\":{\"type\":\"string\"}," + TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK + "}"); +} diff --git a/src/app-stats/AppStatsProvider.h b/src/app-stats/AppStatsProvider.h new file mode 100644 index 0000000..dccb66a --- /dev/null +++ b/src/app-stats/AppStatsProvider.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_APP_STATS_PROVIDER_H_ +#define _CONTEXT_APP_STATS_PROVIDER_H_ + +#include +#include "AppStatisticsTypes.h" + +namespace ctx { + + class AppStatsProvider : public ContextProvider { + public: + int read(Json option, Json *requestResult); + virtual void submitTriggerItem(); + + protected: + AppStatsProvider(const char *subject); + virtual ~AppStatsProvider(); + }; + + + class RecentAppProvider : public AppStatsProvider { + public: + RecentAppProvider() : + AppStatsProvider(APP_SUBJ_RECENTLY_USED) {} + }; + + + class FrequentAppProvider : public AppStatsProvider { + public: + FrequentAppProvider() : + AppStatsProvider(APP_SUBJ_FREQUENTLY_USED) {} + }; + + + class RareAppProvider : public AppStatsProvider { + public: + RareAppProvider() : + AppStatsProvider(APP_SUBJ_RARELY_USED) {} + }; + + + class AppPeakTimeProvider : public AppStatsProvider { + public: + AppPeakTimeProvider() : + AppStatsProvider(APP_SUBJ_PEAK_TIME) {} + }; + + + class AppSettingProvider : public AppStatsProvider { + public: + AppSettingProvider() : + AppStatsProvider(APP_SUBJ_COMMON_SETTING) {} + }; + + + class AppFreqProvider : public AppStatsProvider { + public: + AppFreqProvider() : + AppStatsProvider(APP_SUBJ_FREQUENCY) {} + + void submitTriggerItem(); + }; + +} /* namespace ctx */ + +#endif /* _CONTEXT_APP_STATS_PROVIDER_H_ */ diff --git a/src/app-stats/DbHandle.cpp b/src/app-stats/DbHandle.cpp new file mode 100644 index 0000000..06021e3 --- /dev/null +++ b/src/app-stats/DbHandle.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "AppStatisticsTypes.h" +#include "DbHandle.h" + +using namespace ctx; + +AppDbHandle::AppDbHandle(ContextProvider *provider) : + StatsDbHandleBase(provider) +{ +} + +AppDbHandle::~AppDbHandle() +{ +} + +int AppDbHandle::read(Json filter) +{ + std::string query; + const char *subject = reqProvider->getSubject(); + + if (STR_EQ(subject, APP_SUBJ_RECENTLY_USED)) { + query = createSqlRecentlyUsed(filter); + + } else if (STR_EQ(subject, APP_SUBJ_FREQUENTLY_USED)) { + query = createSqlFrequentlyUsed(filter); + + } else if (STR_EQ(subject, APP_SUBJ_RARELY_USED)) { + query = createSqlRarelyUsed(filter); + + } else if (STR_EQ(subject, APP_SUBJ_PEAK_TIME)) { + query = createSqlPeakTime(filter); + + } else if (STR_EQ(subject, APP_SUBJ_COMMON_SETTING)) { + query = createSqlCommonSetting(filter); + + } else if (STR_EQ(subject, APP_SUBJ_FREQUENCY)) { + isTriggerItem = true; + query = createSqlFrequency(filter); + } + + IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); + + bool ret = executeQuery(filter, query.c_str()); + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + + return ERR_NONE; +} + +std::string AppDbHandle::createWhereClauseWithDeviceStatus(Json filter) +{ + std::stringstream whereClause; + std::string bssid; + int audioJack; + + whereClause << StatsDbHandleBase::createWhereClause(filter); + + if (filter.get(NULL, STATS_BSSID, &bssid)) + whereClause << " AND " STATS_BSSID " = '" << bssid << "'"; + + if (filter.get(NULL, STATS_AUDIO_JACK, &audioJack)) + whereClause << " AND " STATS_AUDIO_JACK " = " << audioJack; + + return whereClause.str(); +} + +std::string AppDbHandle::createSqlPeakTime(Json filter) +{ + return StatsDbHandleBase::createSqlPeakTime(filter, APP_TABLE_USAGE_LOG, createWhereClause(filter)); +} + +std::string AppDbHandle::createSqlCommonSetting(Json filter) +{ + return StatsDbHandleBase::createSqlCommonSetting(filter, APP_TABLE_USAGE_LOG, createWhereClause(filter)); +} + +std::string AppDbHandle::createSqlFrequency(Json filter) +{ + Json filterCleaned; + std::string weekStr; + std::string timeOfDay; + std::string appId; + + if (!filter.get(NULL, STATS_APP_ID, &appId)) { + _E("Invalid parameter"); + return ""; + } + + if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) + filterCleaned.set(NULL, STATS_DAY_OF_WEEK, weekStr); + + if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) + filterCleaned.set(NULL, STATS_TIME_OF_DAY, timeOfDay); + + std::string whereClause = createWhereClause(filterCleaned); + + std::stringstream query; + + query << + "DELETE FROM " APP_TEMP_USAGE_FREQ ";"; + + query << + "INSERT INTO " APP_TEMP_USAGE_FREQ \ + " SELECT " STATS_APP_ID ", COUNT(*) AS " STATS_TOTAL_COUNT \ + " FROM " APP_TABLE_USAGE_LOG \ + " WHERE " << whereClause << + " GROUP BY " STATS_APP_ID ";"; + + query << + "INSERT OR IGNORE INTO " APP_TEMP_USAGE_FREQ " (" STATS_APP_ID ")" \ + " VALUES ('" << appId << "');"; + + query << + "SELECT S." STATS_APP_ID ", S." STATS_TOTAL_COUNT ", 1+COUNT(lesser." STATS_TOTAL_COUNT ") AS " STATS_RANK \ + " FROM " APP_TEMP_USAGE_FREQ " AS S" \ + " LEFT JOIN " APP_TEMP_USAGE_FREQ " AS lesser" \ + " ON S." STATS_TOTAL_COUNT " < lesser." STATS_TOTAL_COUNT \ + " WHERE S." STATS_APP_ID " = '" << appId << "'"; + + return query.str(); +} + +std::string AppDbHandle::createSqlRecentlyUsed(Json filter) +{ + std::stringstream query; + int limit = DEFAULT_LIMIT; + + filter.get(NULL, STATS_RESULT_SIZE, &limit); + + query << + "SELECT " STATS_APP_ID ", " \ + "COUNT(*) AS " STATS_TOTAL_COUNT ", " \ + "SUM(" STATS_DURATION ") AS " STATS_TOTAL_DURATION ", " \ + "MAX(" STATS_UNIV_TIME ") AS " STATS_LAST_TIME \ + " FROM " APP_TABLE_USAGE_LOG \ + " WHERE " << createWhereClauseWithDeviceStatus(filter) << + " GROUP BY " STATS_APP_ID \ + " ORDER BY MAX(" STATS_UNIV_TIME ") DESC" \ + " LIMIT " << limit; + + return query.str(); +} + +std::string AppDbHandle::createSqlFrequentlyUsed(Json filter) +{ + std::stringstream query; + int limit = DEFAULT_LIMIT; + + filter.get(NULL, STATS_RESULT_SIZE, &limit); + + query << + "SELECT " STATS_APP_ID ", " \ + "COUNT(*) AS " STATS_TOTAL_COUNT ", " \ + "SUM(" STATS_DURATION ") AS " STATS_TOTAL_DURATION ", " \ + "MAX(" STATS_UNIV_TIME ") AS " STATS_LAST_TIME \ + " FROM " APP_TABLE_USAGE_LOG \ + " WHERE " << createWhereClauseWithDeviceStatus(filter) << + " GROUP BY " STATS_APP_ID \ + " ORDER BY COUNT(*) DESC" \ + " LIMIT " << limit; + + return query.str(); +} + +std::string AppDbHandle::createSqlRarelyUsed(Json filter) +{ + std::stringstream query; + int limit = DEFAULT_LIMIT; + + filter.get(NULL, STATS_RESULT_SIZE, &limit); + + query << + "SELECT i." STATS_APP_ID ", " \ + "COUNT(u." STATS_DURATION ") AS " STATS_TOTAL_COUNT ", " \ + "IFNULL(SUM(u." STATS_DURATION "),0) AS " STATS_TOTAL_DURATION ", " \ + "IFNULL(MAX(u." STATS_UNIV_TIME "),-1) AS " STATS_LAST_TIME \ + " FROM " APP_TABLE_REMOVABLE_APP " i LEFT OUTER JOIN (" \ + " SELECT * FROM " APP_TABLE_USAGE_LOG \ + " WHERE " << createWhereClauseWithDeviceStatus(filter) << ") u" \ + " ON i." STATS_APP_ID " = u." STATS_APP_ID \ + " GROUP BY i." STATS_APP_ID \ + " ORDER BY " STATS_TOTAL_COUNT " ASC" \ + " LIMIT " << limit; + + return query.str(); +} + +void AppDbHandle::replyTriggerItem(int error, Json &jsonResult) +{ + IF_FAIL_VOID_TAG(STR_EQ(reqProvider->getSubject(), APP_SUBJ_FREQUENCY), _E, "Invalid subject"); + + Json results; + std::string valStr; + int val; + + jsonResult.get(NULL, STATS_APP_ID, &valStr); + results.set(NULL, STATS_APP_ID, valStr); + jsonResult.get(NULL, STATS_TOTAL_COUNT, &val); + results.set(NULL, STATS_TOTAL_COUNT, val); + jsonResult.get(NULL, STATS_RANK, &val); + results.set(NULL, STATS_RANK, val); + + reqProvider->replyToRead(reqFilter, error, results); +} diff --git a/src/app-stats/DbHandle.h b/src/app-stats/DbHandle.h new file mode 100644 index 0000000..9084d87 --- /dev/null +++ b/src/app-stats/DbHandle.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_APP_DB_HANDLE_H_ +#define _CONTEXT_STATS_APP_DB_HANDLE_H_ + +#include +#include +#include "../shared/DbHandleBase.h" + +namespace ctx { + class AppDbHandle : public StatsDbHandleBase { + public: + AppDbHandle(ContextProvider *provider); + ~AppDbHandle(); + + int read(Json filter); + + protected: + std::string createWhereClauseWithDeviceStatus(Json filter); + std::string createSqlRecentlyUsed(Json filter); + std::string createSqlFrequentlyUsed(Json filter); + std::string createSqlRarelyUsed(Json filter); + std::string createSqlPeakTime(Json filter); + std::string createSqlCommonSetting(Json filter); + std::string createSqlFrequency(Json filter); + void replyTriggerItem(int error, Json &jsonResult); + }; +} + +#endif /* End of _CONTEXT_STATS_APP_DB_HANDLE_H_ */ diff --git a/src/app-stats/DbInit.cpp b/src/app-stats/DbInit.cpp new file mode 100644 index 0000000..9c4ec24 --- /dev/null +++ b/src/app-stats/DbInit.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "AppStatisticsTypes.h" +#include "DbInit.h" + +#define EMPTY_CHECKER_QID 999 + +ctx::AppDbInitializer::AppDbInitializer() +{ + __createTable(); + __checkAppList(); +} + +ctx::AppDbInitializer::~AppDbInitializer() +{ +} + +void ctx::AppDbInitializer::__createTable() +{ + static bool done = false; + IF_FAIL_VOID(!done); + + __dbManager.createTable(0, APP_TABLE_USAGE_LOG, APP_TABLE_USAGE_LOG_COLUMNS, NULL, NULL); + __dbManager.createTable(0, APP_TABLE_REMOVABLE_APP, APP_TABLE_REMOVABLE_APP_COLUMNS, NULL, NULL); + __dbManager.execute(0, APP_TEMP_USAGE_FREQ_SQL, NULL); + + done = true; +} + +void ctx::AppDbInitializer::__checkAppList() +{ + __dbManager.execute(EMPTY_CHECKER_QID, "SELECT * FROM " APP_TABLE_REMOVABLE_APP " LIMIT 1", this); +} + +void ctx::AppDbInitializer::__duplicateAppList() +{ + int err; + package_manager_filter_h filter; + + err = package_manager_filter_create(&filter); + IF_FAIL_VOID_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_filter_create() failed"); + + err = package_manager_filter_add_bool(filter, PACKAGE_MANAGER_PKGINFO_PROP_REMOVABLE, true); + IF_FAIL_CATCH_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_filter_add_bool() failed"); + + err = package_manager_filter_foreach_package_info(filter, __packageInfoCb, this); + IF_FAIL_CATCH_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_filter_foreach_package_info() failed"); + +CATCH: + if (filter) + package_manager_filter_destroy(filter); +} + +bool ctx::AppDbInitializer::__packageInfoCb(package_info_h packageInfo, void *userData) +{ + int err = package_info_foreach_app_from_package(packageInfo, PACKAGE_INFO_UIAPP, __appInfoCb, userData); + IF_FAIL_RETURN_TAG(err == PACKAGE_MANAGER_ERROR_NONE, false, _E, "package_info_foreach_app_from_package() failed"); + return true; +} + +bool ctx::AppDbInitializer::__appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData) +{ + Json data; + DatabaseManager dbManager; + + data.set(NULL, STATS_APP_ID, appId); + return dbManager.insert(0, APP_TABLE_REMOVABLE_APP, data, NULL); +} + +void ctx::AppDbInitializer::onTableCreated(unsigned int queryId, int error) +{ +} + +void ctx::AppDbInitializer::onInserted(unsigned int queryId, int error, int64_t rowId) +{ +} + +void ctx::AppDbInitializer::onExecuted(unsigned int queryId, int error, std::vector& records) +{ + if (queryId != EMPTY_CHECKER_QID) { + _E("Unknown Query ID: %d", queryId); + delete this; + return; + } + + if (records.empty()) + __duplicateAppList(); + + delete this; +} diff --git a/src/app-stats/DbInit.h b/src/app-stats/DbInit.h new file mode 100644 index 0000000..c8d18c2 --- /dev/null +++ b/src/app-stats/DbInit.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_APP_DB_INITIALIZER_H_ +#define _CONTEXT_STATS_APP_DB_INITIALIZER_H_ + +#include +#include + +namespace ctx { + + class AppDbInitializer : public IDatabaseListener { + private: + void __createTable(); + void __checkAppList(); + void __duplicateAppList(); + + void onTableCreated(unsigned int queryId, int error); + void onInserted(unsigned int queryId, int error, int64_t rowId); + void onExecuted(unsigned int queryId, int error, std::vector& records); + + static bool __packageInfoCb(package_info_h packageInfo, void *userData); + static bool __appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData); + + DatabaseManager __dbManager; + + public: + AppDbInitializer(); + ~AppDbInitializer(); + }; + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_STATS_APP_DB_INITIALIZER_H_ */ diff --git a/src/app-stats/InstallMonitor.cpp b/src/app-stats/InstallMonitor.cpp new file mode 100644 index 0000000..af5169f --- /dev/null +++ b/src/app-stats/InstallMonitor.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include +#include +#include "AppStatisticsTypes.h" +#include "InstallMonitor.h" + +static package_manager_event_type_e __lastEventType; + +ctx::AppInstallMonitor::AppInstallMonitor() : + __pkgmgrHandle(NULL) +{ + __startMonitoring(); +} + +ctx::AppInstallMonitor::~AppInstallMonitor() +{ + __stopMonitoring(); +} + +bool ctx::AppInstallMonitor::__startMonitoring() +{ + int err = package_manager_create(&__pkgmgrHandle); + IF_FAIL_RETURN_TAG(err == PACKAGE_MANAGER_ERROR_NONE, false, _E, "package_manager_create() failed"); + + err = package_manager_set_event_cb(__pkgmgrHandle, __packageEventCb, this); + IF_FAIL_RETURN_TAG(err == PACKAGE_MANAGER_ERROR_NONE, false, _E, "package_manager_set_event_cb() failed"); + + return true; +} + +void ctx::AppInstallMonitor::__stopMonitoring() +{ + if(__pkgmgrHandle) { + package_manager_unset_event_cb(__pkgmgrHandle); + package_manager_destroy(__pkgmgrHandle); + __pkgmgrHandle = NULL; + } +} + +void ctx::AppInstallMonitor::__packageEventCb(const char *type, const char *package, package_manager_event_type_e eventType, package_manager_event_state_e eventState, int progress, package_manager_error_e error, void *userData) +{ + IF_FAIL_VOID_TAG(error == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager error: %d", error); + + if (!(eventType == PACKAGE_MANAGER_EVENT_TYPE_INSTALL && eventState == PACKAGE_MANAGER_EVENT_STATE_COMPLETED) && + !(eventType == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL && eventState == PACKAGE_MANAGER_EVENT_STATE_STARTED)) { + _D("Skipping event type-%d / state-%d", eventType, eventState); + return; + } + + package_info_h pkgInfo; + int err = package_manager_get_package_info(package, &pkgInfo); + IF_FAIL_VOID_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_get_package_info() failed"); + + __lastEventType = eventType; + + err = package_info_foreach_app_from_package(pkgInfo, PACKAGE_INFO_UIAPP, __appInfoCb, userData); + if (err != PACKAGE_MANAGER_ERROR_NONE) + _E("package_info_foreach_app_from_package() failed"); + + package_info_destroy(pkgInfo); +} + +bool ctx::AppInstallMonitor::__appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData) +{ + DatabaseManager dbManager; + + if (__lastEventType == PACKAGE_MANAGER_EVENT_TYPE_INSTALL) { + Json data; + data.set(NULL, STATS_APP_ID, appId); + dbManager.insert(0, APP_TABLE_REMOVABLE_APP, data, NULL); + } else if (__lastEventType == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL) { + dbManager.execute(0, __createDeletionQuery(APP_TABLE_REMOVABLE_APP, appId).c_str(), NULL); + dbManager.execute(0, __createDeletionQuery(APP_TABLE_USAGE_LOG, appId).c_str(), NULL); + } + + return true; +} + +std::string ctx::AppInstallMonitor::__createDeletionQuery(const char* tableName, const char* appId) +{ + std::stringstream query; + query << "DELETE FROM " << tableName; + query << " WHERE " STATS_APP_ID " = '" << appId << "'"; + return query.str(); +} diff --git a/src/app-stats/InstallMonitor.h b/src/app-stats/InstallMonitor.h new file mode 100644 index 0000000..a022946 --- /dev/null +++ b/src/app-stats/InstallMonitor.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_APP_INSTALL_MONITOR_H_ +#define _CONTEXT_STATS_APP_INSTALL_MONITOR_H_ + +#include +#include + +namespace ctx { + + class AppInstallMonitor : public IDatabaseListener { + private: + package_manager_h __pkgmgrHandle; + + bool __startMonitoring(); + void __stopMonitoring(); + + static std::string __createDeletionQuery(const char* tableName, const char* appId); + static void __packageEventCb(const char *type, const char *package, package_manager_event_type_e eventType, package_manager_event_state_e eventState, int progress, package_manager_error_e error, void *userData); + static bool __appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData); + + void onTableCreated(unsigned int queryId, int error) {} + void onInserted(unsigned int queryId, int error, int64_t rowId) {} + void onExecuted(unsigned int queryId, int error, std::vector& records) {} + + public: + AppInstallMonitor(); + ~AppInstallMonitor(); + }; + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_STATS_APP_INSTALL_MONITOR_H_ */ diff --git a/src/app-stats/app_inactive_detector/AppInactiveDetector.cpp b/src/app-stats/app_inactive_detector/AppInactiveDetector.cpp new file mode 100644 index 0000000..148d655 --- /dev/null +++ b/src/app-stats/app_inactive_detector/AppInactiveDetector.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "AppInactiveDetector.h" +#include "AppInactiveDetectorTypes.h" +#include "InactiveDetector.h" + + +ctx::app_inactive_detector_provider *ctx::app_inactive_detector_provider::__instance = NULL; + +ctx::app_inactive_detector_provider::app_inactive_detector_provider() +{ +} + +ctx::app_inactive_detector_provider::~app_inactive_detector_provider() +{ +} + +ctx::ContextProvider *ctx::app_inactive_detector_provider::create(void *data) +{ + IF_FAIL_RETURN(!__instance, __instance); + __instance = new(std::nothrow) app_inactive_detector_provider(); + IF_FAIL_RETURN_TAG(__instance, NULL, _E, "Memory allocation failed"); + _I(BLUE("Created")); + return __instance; +} + +void ctx::app_inactive_detector_provider::destroy(void *data) +{ + IF_FAIL_VOID(__instance); + delete __instance; + __instance = NULL; + _I(BLUE("Destroyed")); +} + +int ctx::app_inactive_detector_provider::subscribe(const char *subject, ctx::Json option, ctx::Json* request_result) +{ + return ERR_NOT_SUPPORTED; +} + +int ctx::app_inactive_detector_provider::unsubscribe(const char *subject, ctx::Json option) +{ + return ERR_NOT_SUPPORTED; +} + +int ctx::app_inactive_detector_provider::read(const char *subject, ctx::Json option, ctx::Json* request_result) +{ + _I(BLUE("Read")); + _J("Option", option); + + int error = engine->read(subject, option); + return error == ERR_NONE ? ERR_NONE : error; +} + +int ctx::app_inactive_detector_provider::write(const char *subject, ctx::Json data, ctx::Json* request_result) +{ + return ERR_NOT_SUPPORTED; +} + +bool ctx::app_inactive_detector_provider::is_supported() +{ + return true; +} diff --git a/src/app-stats/app_inactive_detector/AppInactiveDetector.h b/src/app-stats/app_inactive_detector/AppInactiveDetector.h new file mode 100644 index 0000000..588130a --- /dev/null +++ b/src/app-stats/app_inactive_detector/AppInactiveDetector.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_APP_INACTIVE_DETECTOR_H__ +#define __CONTEXT_APP_INACTIVE_DETECTOR_H__ + +#include +#include "AppInactiveDetectorTypes.h" +#include "InactiveDetector.h" + +namespace ctx { + + class app_inactive_detector_provider : public ContextProvider { + + public: + static ContextProvider *create(void *data); + static void destroy(void *data); + static bool is_supported(); + + int subscribe(const char *subject, ctx::Json option, ctx::Json *request_result); + int unsubscribe(const char *subject, ctx::Json option); + int read(const char *subject, ctx::Json option, ctx::Json *request_result); + int write(const char *subject, ctx::Json data, ctx::Json *request_result); + + private: + static app_inactive_detector_provider *__instance; + inactive_detector *engine; + + app_inactive_detector_provider(); + ~app_inactive_detector_provider(); + + }; /* class app_inactive_detector_provider */ + +} /* namespace ctx */ + +#endif /* __CONTEXT_APP_INACTIVE_DETECTOR_H__ */ \ No newline at end of file diff --git a/src/app-stats/app_inactive_detector/AppInactiveDetectorTypes.h b/src/app-stats/app_inactive_detector/AppInactiveDetectorTypes.h new file mode 100644 index 0000000..b058b54 --- /dev/null +++ b/src/app-stats/app_inactive_detector/AppInactiveDetectorTypes.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_APP_INACTIVE_DETECTOR_TYPES__ +#define __CONTEXT_APP_INACTIVE_DETECTOR_TYPES__ + +#include + +// Context Items +//#define APP_INACTIVE_SUBJ_RECALCULATE "app/recalculate" +#define APP_INACTIVE_SUBJ_GET_APPS_INACTIVE "app/inactive" +#define APP_INACTIVE_SUBJ_GET_APPS_ACTIVE "app/active" +#define APP_INACTIVE_SUBJ_GET_APPS_WEIGHT "app/weight" +#define APP_INACTIVE_SUBJ_UPDATE_CLUSTERS "app/update" + +enum { + APP_INACTIVE_QUERY_ID_GET_APPS_WEIGHT = 1, + APP_INACTIVE_QUERY_ID_GET_APPS_INACTIVE = 2, + APP_INACTIVE_QUERY_ID_GET_APPS_ACTIVE = 3, + APP_INACTIVE_QUERY_ID_UPDATE_CLUSTERS = 4 +}; + +// Database +#define APP_INACTIVE_DETECTOR_APPINFO_TABLE "context_app_info" +#define APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "app_info" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID "_id" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "package_name" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_TYPE "package_type" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY "is_nodisplay" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED "is_enabled" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT "is_atboot" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED "is_preloaded" +#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP "timestamp" + +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE "context_app_launch_log" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS "app_launch_log" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_ID "_id" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_CONTEXT_APP_INFO_ID "context_app_info_id" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_DURATION "duration" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_SYSTEM_VOLUME "system_volume" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_BSSID "bssid" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP "timestamp" +#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP_UTC "timestamp_utc" + +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE "context_app_activity_classified" +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "app_activity_classified" +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_ID "_id" +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID "context_app_info_id" +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_ACTIVITY_RATE "activity_rate" +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME "timeframe" +#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE "is_active" + + +#define APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "virtual_app_history" +#define APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT "weight" + +// Output Data Key +#define APP_INACTIVE_DETECTOR_DATA_READ "AppsList" +#define APP_INACTIVE_DETECTOR_DATA_TIMESTAMP_FROM "timestamp_from" +#define APP_INACTIVE_DETECTOR_ACTIVITY_RATE "activity_rate" +#define APP_INACTIVE_DETECTOR_DATA_TIMEFRAME "timeframe" +#define APP_INACTIVE_DETECTOR_DATA_ISACTIVE "is_active" + +//Other +#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP "$timestamp" +#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER "$cluster" +#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME "$timeframe" +#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_VALUES "$values" + +// Objects +struct app_t { + int id; + std::string package_name; + int is_nodisplay; + int is_enabled; + int is_atboot; + int is_preloaded; + double timestamp; + int weight; + int is_active; + int timeframe; +}; + + +#define APP_TYPE_INACTIVE_INACTIVE 1 +#define APP_TYPE_INACTIVE_ACTIVE 2 + + +#define APP_INACTIVE_TASK_START_HOUR 3 +#define APP_INACTIVE_TASK_START_MINUTE 0 + + +#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEDAY 60*60*24 +#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_THREEDAYS 60*60*24*3 +#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEWEEK 60*60*24*7 +#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_TWOWEEKS 60*60*24*14 +#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEMONTH 60*60*24*31 + + + +#endif /* __CONTEXT_APP_INACTIVE_DETECTOR_TYPES__ */ \ No newline at end of file diff --git a/src/app-stats/app_inactive_detector/InactiveDetector.cpp b/src/app-stats/app_inactive_detector/InactiveDetector.cpp new file mode 100644 index 0000000..6cc1820 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetector.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "InactiveDetector.h" +#include "InactiveDetectorWeight.h" +#include "InactiveDetectorStorage.h" +#include "InactiveDetectorClassificator.h" +#include "TimerManager.h" + +ctx::inactive_detector::inactive_detector() +{ + timer_id = timer_mgr.setAt( // execute once every night + APP_INACTIVE_TASK_START_HOUR, + APP_INACTIVE_TASK_START_MINUTE, + DayOfWeek::EVERYDAY, + this); + if (timer_id < 0) { + _E("inactive_detector timer set FAIL"); + return; + } else { + update_clusters(); + _D("inactive_detector timer set SUCCESS"); + } + +} + +ctx::inactive_detector::~inactive_detector() +{ + if (timer_id >= 0) { + timer_mgr.remove(timer_id); + _D("inactive_detejctor timer removed"); + } + +} + +bool ctx::inactive_detector::onTimerExpired(int timerId) +{ + update_clusters(); + return true; +} + +int ctx::inactive_detector::update_clusters() +{ + // define timeframes stack + std::vector timeframes; + timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEDAY); + timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_THREEDAYS); + timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEWEEK); + timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_TWOWEEKS); + timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEMONTH); + + // recalculate weights + // foreach timeframe + for(std::vector::iterator timeframe = timeframes.begin(); + timeframe != timeframes.end(); timeframe++) + { + inactive_detector_weight i_detector_weight; + int error = i_detector_weight.request_weights(*timeframe); + _E("update_clusters request_weights:%d, error:%d", *timeframe, error); + } + + return ERR_NONE; +} + +void ctx::inactive_detector::on_cluster_update_finished(std::vector *apps_with_weight, int error) +{ + if (error == ERR_NONE) { + _I("on_cluster_update_finished success"); + } + // clean memory + delete apps_with_weight; +} + +int ctx::inactive_detector::read( + const char *subject, + ctx::Json option) +{ + ctx::inactive_detector_storage *handle = new(std::nothrow) ctx::inactive_detector_storage(); + IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); + + int err = handle->read(subject, option); + if (err != ERR_NONE) { + delete handle; + return err; + } + + return ERR_NONE; +} + +ctx::Json ctx::inactive_detector::to_json(std::vector *app_infos) +{ + ctx::Json data; + + for(std::vector::iterator app_info = app_infos->begin(); + app_info != app_infos->end(); app_info++) + { + ctx::Json app_j; + app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME, app_info->package_name); + app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY, app_info->is_nodisplay); + app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED, app_info->is_enabled); + app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT, app_info->is_atboot); + app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED, app_info->is_preloaded); + app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP, app_info->timestamp); + } + return data; +} diff --git a/src/app-stats/app_inactive_detector/InactiveDetector.h b/src/app-stats/app_inactive_detector/InactiveDetector.h new file mode 100644 index 0000000..8c2d0a0 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetector.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_H__ +#define __CONTEXT_INACTIVE_DETECTOR_H__ + +#include +#include +#include +#include "AppInactiveDetectorTypes.h" +#include + +namespace ctx { + + class inactive_detector : public ITimerListener { + private: + int timer_id; + TimerManager timer_mgr; + public: + inactive_detector(); + ~inactive_detector(); + + int read(const char *subject, + ctx::Json option); + + int update_clusters(); + void on_cluster_update_finished( + std::vector *apps_classified, + int error); + ctx::Json to_json(std::vector *apps); + + bool onTimerExpired(int timerId); + }; /* class inactive_detector */ + +} /* namespace ctx */ + + +#endif /* __CONTEXT_INACTIVE_DETECTOR_H__ */ diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorClassificator.cpp b/src/app-stats/app_inactive_detector/InactiveDetectorClassificator.cpp new file mode 100644 index 0000000..5e5859b --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorClassificator.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2015 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. + */ +#include +#include "InactiveDetector.h" +#include "AppInactiveDetectorTypes.h" +#include "InactiveDetectorClassificator.h" +#include "InactiveDetectorClassificatorKmeans.h" + +int ctx::inactive_detector_classificator::classify(std::vector *apps_with_weights) +{ + inactive_detector_classificator_kmeans kmeans; + int error = kmeans.classify(apps_with_weights); + + return error; +} diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorClassificator.h b/src/app-stats/app_inactive_detector/InactiveDetectorClassificator.h new file mode 100644 index 0000000..fc9abd0 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorClassificator.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_H__ +#define __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_H__ + +#include +#include "AppInactiveDetectorTypes.h" +#include + +namespace ctx { + + class inactive_detector_classificator + { + public: + inactive_detector_classificator(); + ~inactive_detector_classificator(); + + int classify(std::vector *apps_with_weights); + }; /* class inactive_detector_classificator */ + +} /* namespace ctx */ + +#endif /* __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_H__ */ diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeans.cpp b/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeans.cpp new file mode 100644 index 0000000..c0cb93e --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeans.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2015 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. + */ +#include +#include "AppInactiveDetectorTypes.h" +#include "InactiveDetectorClassificatorKmeans.h" +#include "InactiveDetectorClassificatorKmeansTypes.h" +#include +#include + +double ctx::inactive_detector_classificator_kmeans::randomf(double x) +{ + return x * rand() / (RAND_MAX - 1.); +} + +double ctx::inactive_detector_classificator_kmeans::glide_function(double x) +{ + double value = sqrt(log(x) + 1); + return (value > 0 ? value : 0); +} + +point_s *ctx::inactive_detector_classificator_kmeans::reproject_to_2d(std::vector *apps_with_weights) +{ + int distr_size = apps_with_weights->size(); + point_s *p = new point_s[distr_size]; + + int i=0; + for(std::vector::iterator apps_with_weight = apps_with_weights->begin(); + apps_with_weight != apps_with_weights->end(); apps_with_weight++) + { + point_s the_point; + + the_point.x = glide_function(apps_with_weight->weight); // normalize weight values + the_point.y = 0; //remove 3rd dimension of the data + the_point.origin_id = apps_with_weight->package_name; + + p[i] = the_point; + i++; + } + + return p; +} + +bool ctx::inactive_detector_classificator_kmeans::annotate_data(std::vector *apps_with_weights, point_s *c) +{ + int i=0, max_group=-1; + + for(std::vector::iterator apps_with_weight = apps_with_weights->begin(); + apps_with_weight != apps_with_weights->end(); apps_with_weight++) + { + apps_with_weight->is_active = c[i].group; + i++; + max_group = c[i].group > max_group ? c[i].group : max_group; + } + + return max_group == APP_INACTIVE_DETECTOR_KMEANS_CLUSTER_COUNT; +} + +double ctx::inactive_detector_classificator_kmeans::distance_to(point_s *p_from, + point_s *p_to) +{ + double x = p_from->x - p_to->x, y = p_from->y - p_to->y; + return x*x + y*y; +} + +int ctx::inactive_detector_classificator_kmeans::nearest(point_s *pt, + point_s *centers, + int cluster_number, + double *distance) +{ + int i; + int min_i = pt->group; + point_s *c; + + double d; + double min_d = HUGE_VAL; + + for_n { + if (min_d >(d = distance_to(c, pt))) { + min_d = d; min_i = i; + } + } + + if (distance) *distance = min_d; + return min_i; +} + +void ctx::inactive_detector_classificator_kmeans::kpp(point_s *points, int length, point_s *centers, int cluster_number) +{ + int j; + int n_cluster; + double sum; + double *d = new double[length]; + + point_s *p; + centers[0] = points[rand() % length]; + for (n_cluster = 1; n_cluster < cluster_number; n_cluster++) { + sum = 0; + for_len{ + nearest(p, centers, n_cluster, d + j); + sum += d[j]; + } + sum = randomf(sum); + for_len{ + if ((sum -= d[j]) > 0) continue; + centers[n_cluster] = points[j]; + break; + } + } + for_len p->group = nearest(p, centers, n_cluster, 0); + + delete d; +} + +point_s *ctx::inactive_detector_classificator_kmeans::lloyd(point_s *points, int length, int cluster_number) +{ + int i, j, min_i; + int changed; + + point_s *centers = new point_s; + point_s *p, *c; + + /* k++ init */ + kpp(points, length, centers, cluster_number); + + do { + /* group element for centroids are used as counters */ + for_n{ c->group = 0; c->x = c->y = 0; } + for_len{ + c = centers + p->group; + c->group++; + c->x += p->x; c->y += p->y; + } + for_n{ c->x /= c->group; c->y /= c->group; } + + changed = 0; + /* find closest centroid of each point */ + for_len{ + min_i = nearest(p, centers, cluster_number, 0); + if (min_i != p->group) { + changed++; + p->group = min_i; + } + } + } while (changed > (length >> 10)); /* stop when 99.9% of points are good */ + + for_n{ c->group = i; } + + return centers; +} + +int ctx::inactive_detector_classificator_kmeans::classify(std::vector *apps_with_weights) +{ + //array of generated points + point_s *v = reproject_to_2d(apps_with_weights); + //mark cluster for each point, output centers + point_s *c = lloyd(v, apps_with_weights->size(), APP_INACTIVE_DETECTOR_KMEANS_CLUSTER_COUNT); + //append the result to input data + bool classification_is_success = annotate_data(apps_with_weights, c); + + return classification_is_success ? ERR_NONE : ERR_OPERATION_FAILED; +} diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeans.h b/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeans.h new file mode 100644 index 0000000..adc1fe8 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeans.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_H__ +#define __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_H__ + +#include +#include "InactiveDetectorClassificatorKmeansTypes.h" +#include + +namespace ctx { + + #define for_n for (c = centers, i = 0; i < cluster_number; i++, c++) + #define for_len for (j = 0, p = points; j < length; j++, p++) + + class inactive_detector_classificator_kmeans + { + private: + double randomf(double x); + double glide_function(double x); + point_s *reproject_to_2d(std::vector *apps_with_weights); + bool annotate_data(std::vector *apps_with_weights, point_s *c); + + double distance_to(point_s *p_from, point_s *p_to); + int nearest(point_s *pt, point_s *centers, int cluster_number, double *distance); + void kpp(point_s *points, int length, point_s *centers, int centers_count); + point_s *lloyd(point_s *points, int length, int cluster_number); + public: + inactive_detector_classificator_kmeans(); + ~inactive_detector_classificator_kmeans(); + + int classify(std::vector *apps_with_weights); + }; /* class inactive_detector_classificator_kmeans */ +} /* namespace ctx */ + +#endif /* __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_H__ */ diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeansTypes.h b/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeansTypes.h new file mode 100644 index 0000000..8aa7270 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorClassificatorKmeansTypes.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_APP_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_TYPES__ +#define __CONTEXT_APP_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_TYPES__ + +#define APP_INACTIVE_DETECTOR_KMEANS_CLUSTER_COUNT 2 + +typedef struct { + std::string origin_id; + double x; + double y; + int group; +} point_s; + +#endif \ No newline at end of file diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorStorage.cpp b/src/app-stats/app_inactive_detector/InactiveDetectorStorage.cpp new file mode 100644 index 0000000..052c3fe --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorStorage.cpp @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include +#include +#include "InactiveDetector.h" +#include "InactiveDetectorStorage.h" +#include "InactiveDetectorStorageQueries.h" +#include "InactiveDetectorClassificator.h" +#include "AppInactiveDetectorTypes.h" + +/*int ctx::inactive_detector_storage::create_table() +{ + bool ret = __dbManager.createTable(0, WIFI_TABLE_NAME, WIFI_CREATE_TABLE_COLUMNS, NULL, NULL); + _D("Table Creation Request: %s", ret ? "SUCCESS" : "FAIL"); + return ret; +}*/ + + + +// expected Json format example: {timeframe: 1; is_active: 0} +int ctx::inactive_detector_storage::read( + const char *subject, + ctx::Json filter) +{ + std::string query; + query = query_get_apps(subject, filter); + + IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); + + bool ret = __dbManager.execute( + STR_EQ(subject, APP_INACTIVE_SUBJ_GET_APPS_INACTIVE) ? + APP_INACTIVE_QUERY_ID_GET_APPS_INACTIVE : + APP_INACTIVE_QUERY_ID_GET_APPS_ACTIVE, + query.c_str(), + this); + + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + + return ERR_NONE; +} + +std::string ctx::inactive_detector_storage::query_get_apps(const char *subject, ctx::Json filter) +{ + double timeframe; + int is_active; + + std::string query(GET_APP_INFO_INACTIVE_QUERY); + std::string placeholder_timeframe(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME); + std::string placeholder_is_active(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER); + + filter.get(NULL, APP_INACTIVE_DETECTOR_DATA_TIMEFRAME, &timeframe); + filter.get(NULL, APP_INACTIVE_DETECTOR_DATA_ISACTIVE, &is_active); + + std::stringstream timeframe_stream; + timeframe_stream << timeframe; + + std::stringstream is_active_stream; + is_active_stream << is_active; + + inject_params(query, placeholder_timeframe, timeframe_stream.str()); + inject_params(query, placeholder_is_active, is_active_stream.str()); + + return query; +} + +std::string ctx::inactive_detector_storage::query_update_apps(std::vector *apps_with_weights) +{ + std::string delete_query(DELETE_APP_ACTIVITY_CLASSIFIED_BY_TIMEFRAME); + std::string insert_query(INSERT_APP_ACTIVITY_CLASSIFIED); + std::string placeholder_timeframe(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME); + std::string placeholder_values(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_VALUES); + std::string placeholder_is_active(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER); + + std::stringstream timeframe_stream; + timeframe_stream << apps_with_weights->front().timeframe; + + inject_params(delete_query, placeholder_timeframe, timeframe_stream.str()); + inject_params(insert_query, placeholder_values, subquery_form_values(apps_with_weights)); + + std::stringstream result; + result << delete_query << insert_query; + return result.str(); +} + +// foreach app_info id+cluster -> select for insert +std::string ctx::inactive_detector_storage::subquery_form_values(std::vector *apps_with_weights) +{ + std::stringstream select_elements; + + for(std::vector::iterator row = apps_with_weights->begin(); + row != apps_with_weights->end(); row++) + { + //SELECT 1 as is_active, 1 as timeframe, 3964 as context_app_info_id + std::stringstream select_element; + select_element << " SELECT " << row->is_active << " as "; + select_element << APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE; + select_element << ", " << row->timeframe << " as "; + select_element << APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME; + select_element << ", " << row->id << " as "; + select_element << APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID; + + if ((row != apps_with_weights->end()) && (row == --apps_with_weights->end())) + select_element << " UNION "; + + select_elements << select_element; + } + + return select_elements.str(); +} + +void ctx::inactive_detector_storage::json_to_object(std::vector& records, + std::vector *apps_with_weights, bool result_mode) +{ + for(std::vector::iterator row = records.begin(); + row != records.end(); row++) + { + app_t app_with_weight; + if (result_mode) + { + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME, + &app_with_weight.package_name); + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY, + &app_with_weight.is_nodisplay); + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED, + &app_with_weight.is_enabled); + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT, + &app_with_weight.is_atboot); + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED, + &app_with_weight.is_preloaded); + row->get(NULL, APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT, + &app_with_weight.weight); + } + else + { + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID, + &app_with_weight.id); + row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP, + &app_with_weight.timestamp); + row->get(NULL, APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT, + &app_with_weight.weight); + row->get(NULL, APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE, + &app_with_weight.is_active); + } + + apps_with_weights->push_back(app_with_weight); + } +} + +void ctx::inactive_detector_storage::onExecuted(unsigned int query_id, + int error, + std::vector& records) +{ + if (error != ERR_NONE) { + _E("query_id:%d, error:%d", query_id, error); + return; + } + + std::vector *apps_with_weights = NULL; + if (query_id == APP_INACTIVE_QUERY_ID_GET_APPS_INACTIVE || + query_id == APP_INACTIVE_QUERY_ID_GET_APPS_ACTIVE) + { + json_to_object(records, apps_with_weights, TRUE); + } + else if (query_id == APP_INACTIVE_QUERY_ID_GET_APPS_WEIGHT) { + + json_to_object(records, apps_with_weights, FALSE); + + if (apps_with_weights->size() > 0) { + inactive_detector_classificator i_detector_classificator; + int _error = i_detector_classificator.classify(apps_with_weights); + + if(_error == ERR_NONE) + { + std::string query; + query = query_update_apps(apps_with_weights); + bool ret = __dbManager.execute(APP_INACTIVE_QUERY_ID_UPDATE_CLUSTERS, + query.c_str(), + this); + _D("load visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); + } + else + { + _E("classification query_id:%d, error:%d", + query_id, _error); + } + } + } + else if (query_id == APP_INACTIVE_QUERY_ID_UPDATE_CLUSTERS) { + _D("UPDATE_CLUSTERS execute query id: %d", query_id); + } + else { + _E("unknown query_id:%d", query_id); + } +} + +void ctx::inactive_detector_storage::inject_params(std::string& str, const std::string& from, const std::string& to) +{ + if(from.empty()) + return; + size_t start_pos = 0; + while((start_pos = str.find(from, start_pos)) != std::string::npos) { + str.replace(start_pos, from.length(), to); + start_pos += to.length(); + } +} + +// normalzie weights +int ctx::inactive_detector_storage::update_ranks() +{ + return ERR_NONE; +} + +int ctx::inactive_detector_storage::get_apps_info_w_weights( + double timestamp_from) +{ + std::stringstream timestamp_stream; + timestamp_stream << timestamp_from; + std::string timestamp_str = timestamp_stream.str(); + + std::string query(GET_APP_INFO_W_WEIGHT_QUERY); + std::string placeholder(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP); + + inject_params(query, placeholder, timestamp_str); + + bool ret = __dbManager.execute(APP_INACTIVE_QUERY_ID_GET_APPS_WEIGHT, + query.c_str(), + this); + _D("load visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); + + return ERR_NONE ; +} diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorStorage.h b/src/app-stats/app_inactive_detector/InactiveDetectorStorage.h new file mode 100644 index 0000000..0eab066 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorStorage.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_STORAGE_H__ +#define __CONTEXT_INACTIVE_DETECTOR_STORAGE_H__ + +#include +#include "AppInactiveDetectorTypes.h" +#include +#include + +namespace ctx { + + class inactive_detector_storage : public IDatabaseListener + { + private: + //int type; //TODO: enum + void inject_params(std::string& str, + const std::string& from, + const std::string& to); + + void json_to_object(std::vector& records, + std::vector *apps_with_weights, bool result_mode); + + std::string query_get_apps(const char *subject, + ctx::Json filter); + + std::string query_update_apps(std::vector *apps_with_weights); + + std::string subquery_form_values(std::vector *apps_with_weights); + + void onTableCreated(unsigned int query_id, int error) {} + void onInserted(unsigned int query_id, int error, int64_t row_id) {} + void onExecuted(unsigned int query_id, int error, std::vector& records); + + DatabaseManager __dbManager; + + public: + inactive_detector_storage(); + ~inactive_detector_storage(); + + int read(const char *subject, + ctx::Json filter); + + int update_ranks(); + int get_apps_info_w_weights(double timestamp_from); + }; /* class inactive_detector_storage */ + +} /* namespace ctx */ + +#endif /* __CONTEXT_INACTIVE_DETECTOR_STORAGE_H__ */ diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorStorageQueries.h b/src/app-stats/app_inactive_detector/InactiveDetectorStorageQueries.h new file mode 100644 index 0000000..4ef20d3 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorStorageQueries.h @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_STORAGE_QUERIES_H__ +#define __CONTEXT_INACTIVE_DETECTOR_STORAGE_QUERIES_H__ + +#include +#include "AppInactiveDetectorTypes.h" + +/* + +--1 calculate weights +SELECT + app_info._id, + app_info.package_name, + app_info.is_nodisplay, + app_info.is_enabled, + app_info.is_atboot, + app_info.is_preloaded, + app_info.timestamp, + + app_hist_g.weight as weight +FROM + context_app_info app_info + +INNER JOIN + + (SELECT + distinct package_name , + IFNULL((select count(package_name) from context_app_launch_log + where package_name == app_hist.package_name AND timestamp> 8640412900), 0 ) + * + IFNULL((select sum(duration) from context_app_launch_log + where package_name == app_hist.package_name AND timestamp> 8640412900) , 0) + as weight + + FROM context_app_launch_log app_hist +)app_hist_g + +ON app_hist_g.package_name += +app_info.package_name + +ORDER BY app_hist_g.weight + +*/ + +#define GET_APP_INFO_W_WEIGHT_QUERY "SELECT "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_TYPE ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP ", "\ + ""\ + " " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT \ + ""\ + " FROM " APP_INACTIVE_DETECTOR_APPINFO_TABLE " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS \ + ""\ + " INNER JOIN " \ + " (SELECT "\ + " DISTINCT " APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "," \ + " IFNULL((SELECT COUNT(" APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME ")" \ + " FROM " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE \ + " WHERE " APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "==" APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ + " AND " \ + " " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP " >= " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP \ + "), 0) " \ + " * " \ + " IFNULL((SELECT SUM(" APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_DURATION ")" \ + " FROM " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE \ + " WHERE " APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "==" APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ + " AND " \ + " " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP " >= " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP \ + ""\ + "), 0) " \ + " as " APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT \ + " FROM " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE " " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS \ + ") " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS \ + " ON " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ + " = " \ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ + " ORDER BY " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT + +/* +--2 select inner join context_app_info +SELECT + app_info.package_name, + app_info.is_nodisplay, + app_info.is_enabled, + app_info.is_atboot, + app_info.is_preloaded, + + activity_classified.activity_rate + +FROM + context_activity_classified activity_classified +INNER JOIN + context_app_info app_info +ON activity_classified.context_app_info_id = app_info._id + +WHERE + activity_classified.is_active = 1 + AND + activity_classified.timeframe = 1 +*/ + +#define GET_APP_INFO_INACTIVE_QUERY "SELECT "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT ", "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED ", "\ + " "\ + " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_ACTIVITY_RATE " "\ + " FROM "\ + " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS " "\ + " INNER JOIN "\ + " " APP_INACTIVE_DETECTOR_APPINFO_TABLE " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS " "\ + " ON " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID ""\ + " = " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID " "\ + " WHERE "\ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE ""\ + " = " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER ""\ + " AND "\ + " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME ""\ + " = " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME "" + +/* +--3 update ranks and clusters for each timeframe: delete all for each time frame, add new calculations for apps +DELETE FROM + context_activity_classified +WHERE + timeframe = 1 +*/ + +#define DELETE_APP_ACTIVITY_CLASSIFIED_BY_TIMEFRAME "DELETE FROM "\ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE \ + " WHERE "\ + " timeframe = " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME + + +/*INSERT INTO + context_activity_classified + (is_active, + timeframe, + context_app_info_id) +SELECT + is_active, + timeframe, + context_app_info_id +FROM --make loop + ( + SELECT 1 as is_active, 1 as timeframe, 3964 as context_app_info_id + UNION + SELECT 0 as is_active, 1 as timeframe, 3964 as context_app_info_id + ) q +*/ + +#define INSERT_APP_ACTIVITY_CLASSIFIED " INSERT INTO "\ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE \ + "( " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE ", "\ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME ", "\ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID ")" \ +"SELECT " \ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE "," \ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME ", "\ + APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID \ +"FROM"\ + "(" \ + APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_VALUES \ + ") q" + + + +#endif /* __CONTEXT_INACTIVE_DETECTOR_STORAGE_QUERIES_H__ */ diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorWeight.cpp b/src/app-stats/app_inactive_detector/InactiveDetectorWeight.cpp new file mode 100644 index 0000000..202301b --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorWeight.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "InactiveDetectorWeight.h" +#include "InactiveDetectorStorage.h" + +int ctx::inactive_detector_weight::request_weights( + double timestamp_from) +{ + inactive_detector_storage ids; + // query the database for the result + int error = ids.get_apps_info_w_weights(timestamp_from); + + return error; +} diff --git a/src/app-stats/app_inactive_detector/InactiveDetectorWeight.h b/src/app-stats/app_inactive_detector/InactiveDetectorWeight.h new file mode 100644 index 0000000..8e87473 --- /dev/null +++ b/src/app-stats/app_inactive_detector/InactiveDetectorWeight.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_WEIGHT_H__ +#define __CONTEXT_INACTIVE_DETECTOR_WEIGHT_H__ + +// #include +// #include + +namespace ctx { + + class inactive_detector_weight { + public: + inactive_detector_weight() {}; + ~inactive_detector_weight() {}; + int request_weights(double timestamp_from);// {}; + }; /* class inactive_detector_weight */ + +} /* namespace ctx */ + +#endif /* __CONTEXT_INACTIVE_DETECTOR_WEIGHT_H__ */ \ No newline at end of file diff --git a/src/call/Call.cpp b/src/call/Call.cpp new file mode 100644 index 0000000..a19a2b9 --- /dev/null +++ b/src/call/Call.cpp @@ -0,0 +1,386 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Call.h" + +#define TELEPHONY_NOTI_ID_CNT 8 + +using namespace ctx; + +static bool __telephonyInitialized = false; +static telephony_noti_e __callNotiIds[] = +{ + TELEPHONY_NOTI_VOICE_CALL_STATUS_IDLE, + TELEPHONY_NOTI_VOICE_CALL_STATUS_ACTIVE, +// TELEPHONY_NOTI_VOICE_CALL_STATUS_HELD, +// TELEPHONY_NOTI_VOICE_CALL_STATUS_DIALING, + TELEPHONY_NOTI_VOICE_CALL_STATUS_ALERTING, + TELEPHONY_NOTI_VOICE_CALL_STATUS_INCOMING, + TELEPHONY_NOTI_VIDEO_CALL_STATUS_IDLE, + TELEPHONY_NOTI_VIDEO_CALL_STATUS_ACTIVE, +// TELEPHONY_NOTI_VIDEO_CALL_STATUS_DIALING, + TELEPHONY_NOTI_VIDEO_CALL_STATUS_ALERTING, + TELEPHONY_NOTI_VIDEO_CALL_STATUS_INCOMING, +}; +static Json __latest; + +SocialStatusCall::SocialStatusCall() : + DeviceProviderBase(SOCIAL_ST_SUBJ_CALL) +{ + __handleList.count = 0; + __handleList.handle = NULL; +} + +SocialStatusCall::~SocialStatusCall() +{ +} + +bool SocialStatusCall::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/network.telephony"); +} + +void SocialStatusCall::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" + "\"Medium\":{\"type\":\"string\",\"values\":[\"Voice\",\"Video\"]}," + "\"State\":{\"type\":\"string\",\"values\":[\"Idle\",\"Connecting\",\"Connected\"]}," + "\"Address\":{\"type\":\"string\"}" + "}", + NULL); + /* TODO remove Connecting, Connected */ +} + +void SocialStatusCall::__updateCb(telephony_h handle, telephony_noti_e notiId, void *data, void *userData) +{ + SocialStatusCall *instance = static_cast(userData); + instance->__handleUpdate(handle, notiId, data); +} + +void SocialStatusCall::__handleUpdate(telephony_h handle, telephony_noti_e notiId, void* id) +{ + Json data; + unsigned int count; + telephony_call_h *callList; + + // Call state + switch (notiId) { + case TELEPHONY_NOTI_VOICE_CALL_STATUS_IDLE: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_IDLE: + data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_IDLE); + break; + case TELEPHONY_NOTI_VOICE_CALL_STATUS_ACTIVE: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ACTIVE: + data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_ACTIVE); + break; + case TELEPHONY_NOTI_VOICE_CALL_STATUS_ALERTING: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ALERTING: + data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_ALERTING); + break; + case TELEPHONY_NOTI_VOICE_CALL_STATUS_INCOMING: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_INCOMING: + data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_INCOMING); + break; +/* // Ignore below cases + case TELEPHONY_NOTI_VOICE_CALL_STATUS_HELD: + case TELEPHONY_NOTI_VOICE_CALL_STATUS_DIALING: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_DIALING:*/ + default: + _E("Unkown noti id: %d", notiId); + return; + } + + // Call type + switch (notiId) { + case TELEPHONY_NOTI_VOICE_CALL_STATUS_IDLE: + case TELEPHONY_NOTI_VOICE_CALL_STATUS_ACTIVE: + case TELEPHONY_NOTI_VOICE_CALL_STATUS_ALERTING: + case TELEPHONY_NOTI_VOICE_CALL_STATUS_INCOMING: + data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_VOICE); + break; + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_IDLE: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ACTIVE: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ALERTING: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_INCOMING: + data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_VIDEO); + break; +/* // Ignore below cases + case TELEPHONY_NOTI_VOICE_CALL_STATUS_HELD: + case TELEPHONY_NOTI_VOICE_CALL_STATUS_DIALING: + case TELEPHONY_NOTI_VIDEO_CALL_STATUS_DIALING:*/ + default: + _E("Unkown noti id: %d", notiId); + return; + } + + int err = telephony_call_get_call_list(handle, &count, &callList); + IF_FAIL_VOID_TAG(err == TELEPHONY_ERROR_NONE, _E, "Getting call list failed"); + + unsigned int callId = *static_cast(id); + for (unsigned int i = 0; i < count; i++) { + unsigned int tempId; + // Handle id + if (!__getCallHandleId(callList[i], tempId)) { + continue; + } + + if (callId != tempId) { + continue; + } + + // Address + std::string address; + if (__getCallAddress(callList[i], address)) { + data.set(NULL, SOCIAL_ST_ADDRESS, address); + break; + } + } + + if (__latest != data) { + publish(NULL, ERR_NONE, data); + __latest = data.str(); + } + telephony_call_release_call_list(count, &callList); +} + +bool SocialStatusCall::__initTelephony() +{ + IF_FAIL_RETURN(!__telephonyInitialized, true); + + int err = telephony_init(&__handleList); + IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Initialization failed"); + + __telephonyInitialized = true; + return true; +} + +void SocialStatusCall::__releaseTelephony() +{ + IF_FAIL_VOID(__telephonyInitialized); + + telephony_deinit(&__handleList); + + __telephonyInitialized = false; +} + +bool SocialStatusCall::__setCallback() +{ + /* TODO: Consider dual-sim devices */ + IF_FAIL_RETURN_TAG(__initTelephony(), false, _E, "Initialization failed"); + + int err; + + for (unsigned int i = 0; i < __handleList.count; i++) { + for (unsigned int j = 0; j < TELEPHONY_NOTI_ID_CNT; j++) { + err = telephony_set_noti_cb(__handleList.handle[i], __callNotiIds[j], __updateCb, this); + IF_FAIL_CATCH(err == TELEPHONY_ERROR_NONE); + } + } + + return true; + +CATCH: + _E("Initialization failed"); + __releaseTelephony(); + return false; +} + +void SocialStatusCall::__unsetCallback() +{ + for (unsigned int i = 0; i < __handleList.count; i++) { + for (unsigned int j = 0; j < TELEPHONY_NOTI_ID_CNT; j++) { + telephony_unset_noti_cb(__handleList.handle[i], __callNotiIds[j]); + } + } + + __releaseTelephony(); +} + +bool SocialStatusCall::__getCallState(telephony_call_h& handle, std::string& state) +{ + state.clear(); + + telephony_call_status_e st; + int err = telephony_call_get_status(handle, &st); + IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting state failed"); + + switch (st) { + case TELEPHONY_CALL_STATUS_ACTIVE: + state = SOCIAL_ST_ACTIVE; + break; + case TELEPHONY_CALL_STATUS_HELD: + state = SOCIAL_ST_HELD; + break; + case TELEPHONY_CALL_STATUS_DIALING: + state = SOCIAL_ST_DIALING; + break; + case TELEPHONY_CALL_STATUS_ALERTING: + state = SOCIAL_ST_ALERTING; + break; + case TELEPHONY_CALL_STATUS_INCOMING: + state = SOCIAL_ST_INCOMING; + break; + default: + state = SOCIAL_ST_IDLE; + } + + IF_FAIL_RETURN_TAG(!state.empty(), false, _W, "State is empty"); + + return true; +} + +bool SocialStatusCall::__getCallType(telephony_call_h& handle, std::string& type) +{ + type.clear(); + + telephony_call_type_e t; + int err = telephony_call_get_type(handle, &t); + IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting type failed"); + + switch (t) { + case TELEPHONY_CALL_TYPE_VOICE: + type = SOCIAL_ST_VOICE; + break; + case TELEPHONY_CALL_TYPE_VIDEO: + type = SOCIAL_ST_VIDEO; + break; + default: + _E("Unknown type: %d", t); + return false; + } + + IF_FAIL_RETURN_TAG(!type.empty(), false, _W, "Type is empty"); + + return true; +} + +bool SocialStatusCall::__getCallAddress(telephony_call_h& handle, std::string& address) +{ + address.clear(); + + char* number = NULL; + int err = telephony_call_get_number(handle, &number); + IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting address failed"); + + if (number) { + address = number; + g_free(number); + number = NULL; + } + + IF_FAIL_RETURN_TAG(!address.empty(), false, _W, "Address is empty"); + + return true; +} + +bool SocialStatusCall::__getCallHandleId(telephony_call_h& handle, unsigned int& id) +{ + int err = telephony_call_get_handle_id(handle, &id); + IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting handle id failed"); + + return true; +} + +int SocialStatusCall::subscribe() +{ + bool ret = __setCallback(); + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int SocialStatusCall::unsubscribe() +{ + __unsetCallback(); + return ERR_NONE; +} + +bool SocialStatusCall::__readCurrentStatus(telephony_h& handle, Json* data) +{ + unsigned int count = 0; + telephony_call_h *callList = NULL; + telephony_call_get_call_list(handle, &count, &callList); + + // Default data + data->set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_IDLE); + + // Held & Dialing are ignored + for (unsigned int i = 0; i < count; i++) { + // Call state + std::string state; + if (__getCallState(callList[i], state)) { + // Skip Held & Dialing + if (state.compare(SOCIAL_ST_HELD) == 0 || state.compare(SOCIAL_ST_DIALING) == 0) + continue; + + data->set(NULL, SOCIAL_ST_STATE, state); + } + + // Call type + std::string type; + if (__getCallType(callList[i], type)) { + data->set(NULL, SOCIAL_ST_MEDIUM, type); + } + + // Address + std::string address; + if (__getCallAddress(callList[i], address)) { + data->set(NULL, SOCIAL_ST_ADDRESS, address); + } + + if (state == SOCIAL_ST_ACTIVE) { + break; + } + } + + telephony_call_release_call_list(count, &callList); + return true; +} + +int SocialStatusCall::read() +{ + bool temporaryHandle = false; + if (!__telephonyInitialized) { + IF_FAIL_RETURN(__initTelephony(), ERR_OPERATION_FAILED); + temporaryHandle = true; + } + + bool ret = true; + Json data; + data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_IDLE); + + for (unsigned int i = 0; i < __handleList.count; i++) { + telephony_sim_state_e state; + int err = telephony_sim_get_state(__handleList.handle[i], &state); + IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting SIM status failed"); + + if (state != TELEPHONY_SIM_STATE_AVAILABLE) + continue; + + ret = __readCurrentStatus(__handleList.handle[i], &data); + break; + } + + if (temporaryHandle) + __releaseTelephony(); + + if (ret) { + replyToRead(NULL, ERR_NONE, data); + return ERR_NONE; + } + + return ERR_OPERATION_FAILED; +} diff --git a/src/call/Call.h b/src/call/Call.h new file mode 100644 index 0000000..a53276f --- /dev/null +++ b/src/call/Call.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_CALL_H_ +#define _CONTEXT_SOCIAL_STATUS_CALL_H_ + +#include +#include "../shared/SocialTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class SocialStatusCall : public DeviceProviderBase { + public: + SocialStatusCall(); + ~SocialStatusCall(); + + int subscribe(); + int unsubscribe(); + int read(); + + bool isSupported(); + void submitTriggerItem(); + + private: + telephony_handle_list_s __handleList; + + bool __initTelephony(); + void __releaseTelephony(); + bool __setCallback(); + void __unsetCallback(); + bool __readCurrentStatus(telephony_h& handle, Json* data); + + bool __getCallState(telephony_call_h& handle, std::string& state); + bool __getCallType(telephony_call_h& handle, std::string& type); + bool __getCallAddress(telephony_call_h& handle, std::string& address); + bool __getCallHandleId(telephony_call_h& handle, unsigned int& id); + + void __handleUpdate(telephony_h handle, telephony_noti_e notiId, void* id); + static void __updateCb(telephony_h handle, telephony_noti_e notiId, void *data, void *userData); + }; +} + +#endif // _CONTEXT_SOCIAL_STATUS_CALL_H_ diff --git a/src/contacts/Contacts.cpp b/src/contacts/Contacts.cpp new file mode 100644 index 0000000..42789a3 --- /dev/null +++ b/src/contacts/Contacts.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "Contacts.h" + +#define MY_PROFILE_VIEW _contacts_my_profile._uri +#define PERSON_VIEW _contacts_person._uri +#define TIME_INTERVAL 1 + +using namespace ctx; + +SocialStatusContacts::SocialStatusContacts() : + DeviceProviderBase(SOCIAL_ST_SUBJ_CONTACTS), + __latestMyProfile(0), + __latestPerson(0) +{ +} + +SocialStatusContacts::~SocialStatusContacts() +{ +} + +bool SocialStatusContacts::isSupported() +{ + return true; +} + +void SocialStatusContacts::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE, + "{" + "\"Event\":{\"type\":\"string\",\"values\":[\"Changed\"]}," + "\"Type\":{\"type\":\"string\",\"values\":[\"MyProfile\",\"Person\"]}" + "}", + NULL); +} + +void SocialStatusContacts::__updateCb(const char* viewUri, void* userData) +{ + SocialStatusContacts *instance = static_cast(userData); + instance->__handleUpdate(viewUri); +} + +void SocialStatusContacts::__handleUpdate(const char* viewUri) +{ + if (!STR_EQ(viewUri, _contacts_my_profile._uri) && !STR_EQ(viewUri, _contacts_person._uri)) { + _W("Unknown view uri"); + return; + } + + std::string view = (STR_EQ(viewUri, _contacts_my_profile._uri)? SOCIAL_ST_MY_PROFILE : SOCIAL_ST_PERSON); + IF_FAIL_VOID_TAG(!__isConsecutiveChange(viewUri), _D, "Ignore consecutive db change: %s", view.c_str()); + + Json data; + data.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_CHANGED); + data.set(NULL, SOCIAL_ST_TYPE, view); + publish(NULL, ERR_NONE, data); +} + +bool SocialStatusContacts::__isConsecutiveChange(const char* viewUri) +{ + time_t now = time(NULL); + double diff = 0; + + if (STR_EQ(viewUri, MY_PROFILE_VIEW)) { + diff = difftime(now, __latestMyProfile); + __latestMyProfile = now; + } else if (STR_EQ(viewUri, PERSON_VIEW)) { + diff = difftime(now, __latestPerson); + __latestPerson = now; + } + + if (diff < TIME_INTERVAL) + return true; + + return false; +} + +bool SocialStatusContacts::__setCallback() +{ + int err; + + err = contacts_connect(); + IF_FAIL_RETURN_TAG(err == CONTACTS_ERROR_NONE, false, _E, "Connecting contacts failed"); + + err = contacts_db_add_changed_cb(MY_PROFILE_VIEW, __updateCb, this); + IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "Setting my profile view changed callback failed"); + + err = contacts_db_add_changed_cb(PERSON_VIEW, __updateCb, this); + IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "Setting person view changed callback failed"); + + return true; + +CATCH: + contacts_disconnect(); + return false; +} + +void SocialStatusContacts::__unsetCallback() +{ + contacts_db_remove_changed_cb(MY_PROFILE_VIEW, __updateCb, this); + contacts_db_remove_changed_cb(PERSON_VIEW, __updateCb, this); + + contacts_disconnect(); + + __latestMyProfile = 0; + __latestPerson = 0; +} + +int SocialStatusContacts::subscribe() +{ + bool ret = __setCallback(); + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int SocialStatusContacts::unsubscribe() +{ + __unsetCallback(); + return ERR_NONE; +} diff --git a/src/contacts/Contacts.h b/src/contacts/Contacts.h new file mode 100644 index 0000000..28b68ce --- /dev/null +++ b/src/contacts/Contacts.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_SOCIAL_STATUS_CONTACTS_H_ +#define _CONTEXT_SOCIAL_STATUS_CONTACTS_H_ + +#include +#include "../shared/SocialTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class SocialStatusContacts : public DeviceProviderBase { + public: + SocialStatusContacts(); + ~SocialStatusContacts(); + + int subscribe(); + int unsubscribe(); + + bool isSupported(); + void submitTriggerItem(); + + private: + time_t __latestMyProfile; + time_t __latestPerson; + + bool __setCallback(); + void __unsetCallback(); + void __handleUpdate(const char* viewUri); + static void __updateCb(const char* viewUri, void* userData); + bool __isConsecutiveChange(const char* viewUri); + }; +} + +#endif // _CONTEXT_SOCIAL_STATUS_CONTACTS_H_ diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt deleted file mode 100644 index 16f436f..0000000 --- a/src/device/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -# prvd_cdef, prvd_deps, and prvd_srcs need to be set properly - -# Common Profile -FILE(GLOB prvd_srcs ./*.cpp system/Alarm.cpp system/Time.cpp) -SET(prvd_deps vconf capi-system-info capi-system-device capi-system-runtime-info) - -# Mobile Profile -IF("${PROFILE}" STREQUAL "mobile") - SET(prvd_deps ${prvd_deps} capi-network-bluetooth capi-network-wifi contacts-service2) - SET(prvd_deps ${prvd_deps} capi-telephony tapi msg-service capi-messaging-email motion) - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} activity/*.cpp) - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} system/*.cpp) - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} social/*.cpp) -ENDIF("${PROFILE}" STREQUAL "mobile") - -# Wearable Profile -IF("${PROFILE}" STREQUAL "wearable") - SET(prvd_deps ${prvd_deps} capi-network-bluetooth capi-network-wifi) - SET(prvd_deps ${prvd_deps} capi-telephony tapi msg-service motion) - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} activity/*.cpp) - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} system/*.cpp) - FILE(GLOB prvd_srcs ${prvd_srcs} social/Call.cpp social/Message.cpp) -ENDIF("${PROFILE}" STREQUAL "wearable") - -# TV Profile -IF("${PROFILE}" STREQUAL "tv") - SET(prvd_deps ${prvd_deps} capi-network-bluetooth capi-network-wifi) - FILE(GLOB prvd_srcs ${prvd_srcs} system/Headphone.cpp system/Wifi.cpp) -ENDIF("${PROFILE}" STREQUAL "tv") diff --git a/src/device/DeviceContextProvider.cpp b/src/device/DeviceContextProvider.cpp deleted file mode 100644 index 332efdc..0000000 --- a/src/device/DeviceContextProvider.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include - -#include "system/SystemTypes.h" -#include "social/SocialTypes.h" -#include "activity/ActivityTypes.h" - -#include "system/Alarm.h" -#include "system/Time.h" - -#ifdef _MOBILE_ -#include "system/runtime_info/Charger.h" -#include "system/runtime_info/Gps.h" -#include "system/runtime_info/Usb.h" -#include "system/Wifi.h" -#include "system/Headphone.h" -#include "system/Battery.h" -#include "system/Psmode.h" -#include "social/Call.h" -#include "social/Email.h" -#include "social/Message.h" -#include "social/Contacts.h" -#include "activity/Activity.h" -#endif - -#ifdef _WEARABLE_ -#include "system/runtime_info/Charger.h" -#include "system/runtime_info/Gps.h" -#include "system/runtime_info/Usb.h" -#include "system/Wifi.h" -#include "system/Headphone.h" -#include "system/Battery.h" -#include "system/Psmode.h" -#include "social/Call.h" -#include "social/Message.h" -#include "activity/Activity.h" -#endif - -#define PRIV_NETWORK "network.get" -#define PRIV_TELEPHONY "telephony" -#define PRIV_MESSAGE "message.read" -#define PRIV_CONTACT "contact.read" - -template -void registerProvider(const char *subject, const char *privilege) -{ - Provider *provider = new(std::nothrow) Provider(); - IF_FAIL_VOID_TAG(provider, _E, "Memory allocation failed"); - - if (!provider->isSupported()) { - delete provider; - return; - } - - provider->registerProvider(privilege, provider); - provider->submitTriggerItem(); -} - -SO_EXPORT bool ctx::initDeviceContextProvider() -{ - registerProvider(DEVICE_ST_SUBJ_ALARM, NULL); - registerProvider(DEVICE_ST_SUBJ_TIME, NULL); - -#ifdef _MOBILE_ - registerProvider(DEVICE_ST_SUBJ_WIFI, PRIV_NETWORK); - registerProvider(DEVICE_ST_SUBJ_HEADPHONE, NULL); - - registerProvider(DEVICE_ST_SUBJ_CHARGER, NULL); - registerProvider(DEVICE_ST_SUBJ_GPS, NULL); - registerProvider(DEVICE_ST_SUBJ_USB, NULL); - registerProvider(DEVICE_ST_SUBJ_BATTERY, NULL); - registerProvider(DEVICE_ST_SUBJ_PSMODE, NULL); - - registerProvider(SOCIAL_ST_SUBJ_CALL, PRIV_TELEPHONY); - registerProvider(SOCIAL_ST_SUBJ_EMAIL, NULL); - registerProvider(SOCIAL_ST_SUBJ_MESSAGE, PRIV_MESSAGE); - registerProvider(SOCIAL_ST_SUBJ_CONTACTS, PRIV_CONTACT); - - registerProvider(USER_ACT_SUBJ_STATIONARY, NULL); - registerProvider(USER_ACT_SUBJ_WALKING, NULL); - registerProvider(USER_ACT_SUBJ_RUNNING, NULL); - registerProvider(USER_ACT_SUBJ_IN_VEHICLE, NULL); - - /* Create context providers, which need to be initiated before being subscribed */ - /* - if (DeviceStatusWifi::isSupported()) - DeviceStatusWifi::create(NULL); - */ -#endif - -#ifdef _WEARABLE_ - registerProvider(DEVICE_ST_SUBJ_WIFI, PRIV_NETWORK); - registerProvider(DEVICE_ST_SUBJ_HEADPHONE, NULL); - - registerProvider(DEVICE_ST_SUBJ_CHARGER, NULL); - registerProvider(DEVICE_ST_SUBJ_GPS, NULL); - registerProvider(DEVICE_ST_SUBJ_USB, NULL); - registerProvider(DEVICE_ST_SUBJ_BATTERY, NULL); - registerProvider(DEVICE_ST_SUBJ_PSMODE, NULL); - - registerProvider(SOCIAL_ST_SUBJ_CALL, PRIV_TELEPHONY); - registerProvider(SOCIAL_ST_SUBJ_MESSAGE, PRIV_MESSAGE); - - registerProvider(USER_ACT_SUBJ_STATIONARY, NULL); - registerProvider(USER_ACT_SUBJ_WALKING, NULL); - registerProvider(USER_ACT_SUBJ_RUNNING, NULL); - registerProvider(USER_ACT_SUBJ_IN_VEHICLE, NULL); -#endif - - return true; -} diff --git a/src/device/DeviceProviderBase.cpp b/src/device/DeviceProviderBase.cpp deleted file mode 100644 index 1c5f5ef..0000000 --- a/src/device/DeviceProviderBase.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "DeviceProviderBase.h" - -using namespace ctx; - -DeviceProviderBase::DeviceProviderBase(const char *subject) : - ContextProvider(subject), - __beingSubscribed(false) -{ -} - -bool DeviceProviderBase::isSupported() -{ - return true; -} - -void DeviceProviderBase::submitTriggerItem() -{ -} - -int DeviceProviderBase::subscribe(Json option, Json *requestResult) -{ - IF_FAIL_RETURN(!__beingSubscribed, ERR_NONE); - - int ret = subscribe(); - - if (ret == ERR_NONE) - __beingSubscribed = true; - - return ret; -} - -int DeviceProviderBase::unsubscribe(Json option) -{ - int ret = ERR_NONE; - - if (__beingSubscribed) - ret = unsubscribe(); - - return ret; -} - -int DeviceProviderBase::read(Json option, Json *requestResult) -{ - return read(); -} - -int DeviceProviderBase::write(Json data, Json *requestResult) -{ - return write(); -} - -int DeviceProviderBase::subscribe() -{ - return ERR_NOT_SUPPORTED; -} - -int DeviceProviderBase::unsubscribe() -{ - return ERR_NOT_SUPPORTED; -} - -int DeviceProviderBase::read() -{ - return ERR_NOT_SUPPORTED; -} - -int DeviceProviderBase::write() -{ - return ERR_NOT_SUPPORTED; -} - -bool DeviceProviderBase::getSystemInfoBool(const char *key) -{ - bool supported = false; - int ret = system_info_get_platform_bool(key, &supported); - IF_FAIL_RETURN_TAG(ret == SYSTEM_INFO_ERROR_NONE, false, _E, "system_info_get_platform_bool() failed"); - return supported; -} diff --git a/src/device/DeviceProviderBase.h b/src/device/DeviceProviderBase.h deleted file mode 100644 index f5a55da..0000000 --- a/src/device/DeviceProviderBase.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_DEVICE_PROVIDER_BASE_H_ -#define _CONTEXT_DEVICE_PROVIDER_BASE_H_ - -#include - -namespace ctx { - - class DeviceProviderBase : public ContextProvider { - public: - int subscribe(Json option, Json *requestResult); - int unsubscribe(Json option); - int read(Json option, Json *requestResult); - int write(Json data, Json *requestResult); - - virtual bool isSupported(); - virtual void submitTriggerItem(); - - protected: - bool __beingSubscribed; - - DeviceProviderBase(const char *subject); - virtual ~DeviceProviderBase() {} - - virtual int subscribe(); - virtual int unsubscribe(); - virtual int read(); - virtual int write(); - - static bool getSystemInfoBool(const char *key); - }; -} - -#endif // _CONTEXT_DEVICE_PROVIDER_BASE_H_ diff --git a/src/device/activity/Activity.h b/src/device/activity/Activity.h deleted file mode 100644 index f50b283..0000000 --- a/src/device/activity/Activity.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_ACTIVITY_STATUS_H_ -#define _DEVICE_ACTIVITY_STATUS_H_ - -#include "ActivityBase.h" - -#define GENERATE_ACTIVITY_PROVIDER(actPrvd, actSubj, actType) \ - class actPrvd : public UserActivityBase { \ - public: \ - actPrvd() : UserActivityBase(actSubj, actType) {} \ - }; \ - -namespace ctx { - GENERATE_ACTIVITY_PROVIDER(UserActivityStationary, USER_ACT_SUBJ_STATIONARY, ACTIVITY_STATIONARY); - GENERATE_ACTIVITY_PROVIDER(UserActivityWalking, USER_ACT_SUBJ_WALKING, ACTIVITY_WALK); - GENERATE_ACTIVITY_PROVIDER(UserActivityRunning, USER_ACT_SUBJ_RUNNING, ACTIVITY_RUN); - GENERATE_ACTIVITY_PROVIDER(UserActivityInVehicle, USER_ACT_SUBJ_IN_VEHICLE, ACTIVITY_IN_VEHICLE); -} - -#endif // _DEVICE_ACTIVITY_STATUS_H_ diff --git a/src/device/activity/ActivityBase.cpp b/src/device/activity/ActivityBase.cpp deleted file mode 100644 index 4abda04..0000000 --- a/src/device/activity/ActivityBase.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "ActivityTypes.h" -#include "ActivityBase.h" - -using namespace ctx; - -UserActivityBase::UserActivityBase(const char *subject, activity_type_e type) : - DeviceProviderBase(subject), - __activityType(type), - __activityHandle(NULL) -{ -} - -UserActivityBase::~UserActivityBase() -{ - if (__activityHandle) - activity_release(__activityHandle); -} - -bool UserActivityBase::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/sensor.activity_recognition"); -} - -void UserActivityBase::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE, - "{\"Event\":{\"type\":\"string\", \"values\":[\"Detected\"]}}", - "{\"Accuracy\":{\"type\":\"string\", \"values\":[\"Low\", \"Normal\", \"High\"]}}" - ); -} - -void UserActivityBase::__updateCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void* userData) -{ - IF_FAIL_VOID_TAG(error == ACTIVITY_ERROR_NONE, _E, "Error: %d", error); - - UserActivityBase *instance = static_cast(userData); - instance->__handleUpdate(activity, data, timestamp); -} - -void UserActivityBase::__handleUpdate(activity_type_e activity, const activity_data_h data, double timestamp) -{ - IF_FAIL_VOID_TAG(activity == __activityType, _E, "Invalid activity: %d", activity); - - Json dataRead; - dataRead.set(NULL, USER_ACT_EVENT, USER_ACT_DETECTED); - - activity_accuracy_e accuracy = ACTIVITY_ACCURACY_LOW; - activity_get_accuracy(data, &accuracy); - - switch (accuracy) { - case ACTIVITY_ACCURACY_HIGH: - dataRead.set(NULL, USER_ACT_ACCURACY, USER_ACT_HIGH); - break; - case ACTIVITY_ACCURACY_MID: - dataRead.set(NULL, USER_ACT_ACCURACY, USER_ACT_NORMAL); - break; - default: - dataRead.set(NULL, USER_ACT_ACCURACY, USER_ACT_LOW); - break; - } - - publish(NULL, ERR_NONE, dataRead); -} - -int UserActivityBase::subscribe() -{ - IF_FAIL_RETURN(__activityHandle == NULL, ERR_NONE); - - activity_create(&__activityHandle); - IF_FAIL_RETURN_TAG(__activityHandle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); - - int ret = activity_start_recognition(__activityHandle, __activityType, __updateCb, this); - if (ret != ACTIVITY_ERROR_NONE) { - _E("Recognition starting failed"); - activity_release(__activityHandle); - __activityHandle = NULL; - return ERR_OPERATION_FAILED; - } - - return ERR_NONE; -} - -int UserActivityBase::unsubscribe() -{ - IF_FAIL_RETURN(__activityHandle, ERR_NONE); - - activity_stop_recognition(__activityHandle); - activity_release(__activityHandle); - __activityHandle = NULL; - - return ERR_NONE; -} diff --git a/src/device/activity/ActivityBase.h b/src/device/activity/ActivityBase.h deleted file mode 100644 index ef68d58..0000000 --- a/src/device/activity/ActivityBase.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_ACTIVITY_STATUS_BASE_H_ -#define _DEVICE_ACTIVITY_STATUS_BASE_H_ - -#include -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class UserActivityBase : public DeviceProviderBase { - public: - UserActivityBase(const char *subject, activity_type_e type); - virtual ~UserActivityBase(); - - int subscribe(); - int unsubscribe(); - - bool isSupported(); - void submitTriggerItem(); - - protected: - activity_type_e __activityType; - activity_h __activityHandle; - - private: - void __handleUpdate(activity_type_e activity, const activity_data_h data, double timestamp); - static void __updateCb(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void* userData); - }; - -} - -#endif // _DEVICE_ACTIVITY_STATUS_BASE_H_ diff --git a/src/device/activity/ActivityTypes.h b/src/device/activity/ActivityTypes.h deleted file mode 100644 index 4562b7b..0000000 --- a/src/device/activity/ActivityTypes.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_ACTIVITY_STATUS_TYPES_H_ -#define _DEVICE_ACTIVITY_STATUS_TYPES_H_ - -// Subject -#define USER_ACT_SUBJ_IN_VEHICLE "activity/in_vehicle" -#define USER_ACT_SUBJ_RUNNING "activity/running" -#define USER_ACT_SUBJ_STATIONARY "activity/stationary" -#define USER_ACT_SUBJ_WALKING "activity/walking" - -// Data Key -#define USER_ACT_EVENT "Event" -#define USER_ACT_ACCURACY "Accuracy" - -// Data Value -#define USER_ACT_DETECTED "Detected" -#define USER_ACT_LOW "Low" -#define USER_ACT_NORMAL "Normal" -#define USER_ACT_HIGH "High" - -#endif // _DEVICE_ACTIVITY_STATUS_TYPES_H_ diff --git a/src/device/social/Call.cpp b/src/device/social/Call.cpp deleted file mode 100644 index 460c281..0000000 --- a/src/device/social/Call.cpp +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "SocialTypes.h" -#include "Call.h" - -#define TELEPHONY_NOTI_ID_CNT 8 - -using namespace ctx; - -static bool __telephonyInitialized = false; -static telephony_noti_e __callNotiIds[] = -{ - TELEPHONY_NOTI_VOICE_CALL_STATUS_IDLE, - TELEPHONY_NOTI_VOICE_CALL_STATUS_ACTIVE, -// TELEPHONY_NOTI_VOICE_CALL_STATUS_HELD, -// TELEPHONY_NOTI_VOICE_CALL_STATUS_DIALING, - TELEPHONY_NOTI_VOICE_CALL_STATUS_ALERTING, - TELEPHONY_NOTI_VOICE_CALL_STATUS_INCOMING, - TELEPHONY_NOTI_VIDEO_CALL_STATUS_IDLE, - TELEPHONY_NOTI_VIDEO_CALL_STATUS_ACTIVE, -// TELEPHONY_NOTI_VIDEO_CALL_STATUS_DIALING, - TELEPHONY_NOTI_VIDEO_CALL_STATUS_ALERTING, - TELEPHONY_NOTI_VIDEO_CALL_STATUS_INCOMING, -}; -static Json __latest; - -SocialStatusCall::SocialStatusCall() : - DeviceProviderBase(SOCIAL_ST_SUBJ_CALL) -{ - __handleList.count = 0; - __handleList.handle = NULL; -} - -SocialStatusCall::~SocialStatusCall() -{ -} - -bool SocialStatusCall::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/network.telephony"); -} - -void SocialStatusCall::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" - "\"Medium\":{\"type\":\"string\",\"values\":[\"Voice\",\"Video\"]}," - "\"State\":{\"type\":\"string\",\"values\":[\"Idle\",\"Connecting\",\"Connected\"]}," - "\"Address\":{\"type\":\"string\"}" - "}", - NULL); - /* TODO remove Connecting, Connected */ -} - -void SocialStatusCall::__updateCb(telephony_h handle, telephony_noti_e notiId, void *data, void *userData) -{ - SocialStatusCall *instance = static_cast(userData); - instance->__handleUpdate(handle, notiId, data); -} - -void SocialStatusCall::__handleUpdate(telephony_h handle, telephony_noti_e notiId, void* id) -{ - Json data; - unsigned int count; - telephony_call_h *callList; - - // Call state - switch (notiId) { - case TELEPHONY_NOTI_VOICE_CALL_STATUS_IDLE: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_IDLE: - data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_IDLE); - break; - case TELEPHONY_NOTI_VOICE_CALL_STATUS_ACTIVE: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ACTIVE: - data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_ACTIVE); - break; - case TELEPHONY_NOTI_VOICE_CALL_STATUS_ALERTING: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ALERTING: - data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_ALERTING); - break; - case TELEPHONY_NOTI_VOICE_CALL_STATUS_INCOMING: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_INCOMING: - data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_INCOMING); - break; -/* // Ignore below cases - case TELEPHONY_NOTI_VOICE_CALL_STATUS_HELD: - case TELEPHONY_NOTI_VOICE_CALL_STATUS_DIALING: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_DIALING:*/ - default: - _E("Unkown noti id: %d", notiId); - return; - } - - // Call type - switch (notiId) { - case TELEPHONY_NOTI_VOICE_CALL_STATUS_IDLE: - case TELEPHONY_NOTI_VOICE_CALL_STATUS_ACTIVE: - case TELEPHONY_NOTI_VOICE_CALL_STATUS_ALERTING: - case TELEPHONY_NOTI_VOICE_CALL_STATUS_INCOMING: - data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_VOICE); - break; - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_IDLE: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ACTIVE: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_ALERTING: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_INCOMING: - data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_VIDEO); - break; -/* // Ignore below cases - case TELEPHONY_NOTI_VOICE_CALL_STATUS_HELD: - case TELEPHONY_NOTI_VOICE_CALL_STATUS_DIALING: - case TELEPHONY_NOTI_VIDEO_CALL_STATUS_DIALING:*/ - default: - _E("Unkown noti id: %d", notiId); - return; - } - - int err = telephony_call_get_call_list(handle, &count, &callList); - IF_FAIL_VOID_TAG(err == TELEPHONY_ERROR_NONE, _E, "Getting call list failed"); - - unsigned int callId = *static_cast(id); - for (unsigned int i = 0; i < count; i++) { - unsigned int tempId; - // Handle id - if (!__getCallHandleId(callList[i], tempId)) { - continue; - } - - if (callId != tempId) { - continue; - } - - // Address - std::string address; - if (__getCallAddress(callList[i], address)) { - data.set(NULL, SOCIAL_ST_ADDRESS, address); - break; - } - } - - if (__latest != data) { - publish(NULL, ERR_NONE, data); - __latest = data.str(); - } - telephony_call_release_call_list(count, &callList); -} - -bool SocialStatusCall::__initTelephony() -{ - IF_FAIL_RETURN(!__telephonyInitialized, true); - - int err = telephony_init(&__handleList); - IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Initialization failed"); - - __telephonyInitialized = true; - return true; -} - -void SocialStatusCall::__releaseTelephony() -{ - IF_FAIL_VOID(__telephonyInitialized); - - telephony_deinit(&__handleList); - - __telephonyInitialized = false; -} - -bool SocialStatusCall::__setCallback() -{ - /* TODO: Consider dual-sim devices */ - IF_FAIL_RETURN_TAG(__initTelephony(), false, _E, "Initialization failed"); - - int err; - - for (unsigned int i = 0; i < __handleList.count; i++) { - for (unsigned int j = 0; j < TELEPHONY_NOTI_ID_CNT; j++) { - err = telephony_set_noti_cb(__handleList.handle[i], __callNotiIds[j], __updateCb, this); - IF_FAIL_CATCH(err == TELEPHONY_ERROR_NONE); - } - } - - return true; - -CATCH: - _E("Initialization failed"); - __releaseTelephony(); - return false; -} - -void SocialStatusCall::__unsetCallback() -{ - for (unsigned int i = 0; i < __handleList.count; i++) { - for (unsigned int j = 0; j < TELEPHONY_NOTI_ID_CNT; j++) { - telephony_unset_noti_cb(__handleList.handle[i], __callNotiIds[j]); - } - } - - __releaseTelephony(); -} - -bool SocialStatusCall::__getCallState(telephony_call_h& handle, std::string& state) -{ - state.clear(); - - telephony_call_status_e st; - int err = telephony_call_get_status(handle, &st); - IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting state failed"); - - switch (st) { - case TELEPHONY_CALL_STATUS_ACTIVE: - state = SOCIAL_ST_ACTIVE; - break; - case TELEPHONY_CALL_STATUS_HELD: - state = SOCIAL_ST_HELD; - break; - case TELEPHONY_CALL_STATUS_DIALING: - state = SOCIAL_ST_DIALING; - break; - case TELEPHONY_CALL_STATUS_ALERTING: - state = SOCIAL_ST_ALERTING; - break; - case TELEPHONY_CALL_STATUS_INCOMING: - state = SOCIAL_ST_INCOMING; - break; - default: - state = SOCIAL_ST_IDLE; - } - - IF_FAIL_RETURN_TAG(!state.empty(), false, _W, "State is empty"); - - return true; -} - -bool SocialStatusCall::__getCallType(telephony_call_h& handle, std::string& type) -{ - type.clear(); - - telephony_call_type_e t; - int err = telephony_call_get_type(handle, &t); - IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting type failed"); - - switch (t) { - case TELEPHONY_CALL_TYPE_VOICE: - type = SOCIAL_ST_VOICE; - break; - case TELEPHONY_CALL_TYPE_VIDEO: - type = SOCIAL_ST_VIDEO; - break; - default: - _E("Unknown type: %d", t); - return false; - } - - IF_FAIL_RETURN_TAG(!type.empty(), false, _W, "Type is empty"); - - return true; -} - -bool SocialStatusCall::__getCallAddress(telephony_call_h& handle, std::string& address) -{ - address.clear(); - - char* number = NULL; - int err = telephony_call_get_number(handle, &number); - IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting address failed"); - - if (number) { - address = number; - g_free(number); - number = NULL; - } - - IF_FAIL_RETURN_TAG(!address.empty(), false, _W, "Address is empty"); - - return true; -} - -bool SocialStatusCall::__getCallHandleId(telephony_call_h& handle, unsigned int& id) -{ - int err = telephony_call_get_handle_id(handle, &id); - IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, false, _E, "Getting handle id failed"); - - return true; -} - -int SocialStatusCall::subscribe() -{ - bool ret = __setCallback(); - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int SocialStatusCall::unsubscribe() -{ - __unsetCallback(); - return ERR_NONE; -} - -bool SocialStatusCall::__readCurrentStatus(telephony_h& handle, Json* data) -{ - unsigned int count = 0; - telephony_call_h *callList = NULL; - telephony_call_get_call_list(handle, &count, &callList); - - // Default data - data->set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_IDLE); - - // Held & Dialing are ignored - for (unsigned int i = 0; i < count; i++) { - // Call state - std::string state; - if (__getCallState(callList[i], state)) { - // Skip Held & Dialing - if (state.compare(SOCIAL_ST_HELD) == 0 || state.compare(SOCIAL_ST_DIALING) == 0) - continue; - - data->set(NULL, SOCIAL_ST_STATE, state); - } - - // Call type - std::string type; - if (__getCallType(callList[i], type)) { - data->set(NULL, SOCIAL_ST_MEDIUM, type); - } - - // Address - std::string address; - if (__getCallAddress(callList[i], address)) { - data->set(NULL, SOCIAL_ST_ADDRESS, address); - } - - if (state == SOCIAL_ST_ACTIVE) { - break; - } - } - - telephony_call_release_call_list(count, &callList); - return true; -} - -int SocialStatusCall::read() -{ - bool temporaryHandle = false; - if (!__telephonyInitialized) { - IF_FAIL_RETURN(__initTelephony(), ERR_OPERATION_FAILED); - temporaryHandle = true; - } - - bool ret = true; - Json data; - data.set(NULL, SOCIAL_ST_STATE, SOCIAL_ST_IDLE); - - for (unsigned int i = 0; i < __handleList.count; i++) { - telephony_sim_state_e state; - int err = telephony_sim_get_state(__handleList.handle[i], &state); - IF_FAIL_RETURN_TAG(err == TELEPHONY_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting SIM status failed"); - - if (state != TELEPHONY_SIM_STATE_AVAILABLE) - continue; - - ret = __readCurrentStatus(__handleList.handle[i], &data); - break; - } - - if (temporaryHandle) - __releaseTelephony(); - - if (ret) { - replyToRead(NULL, ERR_NONE, data); - return ERR_NONE; - } - - return ERR_OPERATION_FAILED; -} diff --git a/src/device/social/Call.h b/src/device/social/Call.h deleted file mode 100644 index 02a4eaa..0000000 --- a/src/device/social/Call.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_CALL_H_ -#define _CONTEXT_SOCIAL_STATUS_CALL_H_ - -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class SocialStatusCall : public DeviceProviderBase { - public: - SocialStatusCall(); - ~SocialStatusCall(); - - int subscribe(); - int unsubscribe(); - int read(); - - bool isSupported(); - void submitTriggerItem(); - - private: - telephony_handle_list_s __handleList; - - bool __initTelephony(); - void __releaseTelephony(); - bool __setCallback(); - void __unsetCallback(); - bool __readCurrentStatus(telephony_h& handle, Json* data); - - bool __getCallState(telephony_call_h& handle, std::string& state); - bool __getCallType(telephony_call_h& handle, std::string& type); - bool __getCallAddress(telephony_call_h& handle, std::string& address); - bool __getCallHandleId(telephony_call_h& handle, unsigned int& id); - - void __handleUpdate(telephony_h handle, telephony_noti_e notiId, void* id); - static void __updateCb(telephony_h handle, telephony_noti_e notiId, void *data, void *userData); - }; -} - -#endif // _CONTEXT_SOCIAL_STATUS_CALL_H_ diff --git a/src/device/social/Contacts.cpp b/src/device/social/Contacts.cpp deleted file mode 100644 index 55ff19a..0000000 --- a/src/device/social/Contacts.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "SocialTypes.h" -#include "Contacts.h" - -#define MY_PROFILE_VIEW _contacts_my_profile._uri -#define PERSON_VIEW _contacts_person._uri -#define TIME_INTERVAL 1 - -using namespace ctx; - -SocialStatusContacts::SocialStatusContacts() : - DeviceProviderBase(SOCIAL_ST_SUBJ_CONTACTS), - __latestMyProfile(0), - __latestPerson(0) -{ -} - -SocialStatusContacts::~SocialStatusContacts() -{ -} - -bool SocialStatusContacts::isSupported() -{ - return true; -} - -void SocialStatusContacts::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE, - "{" - "\"Event\":{\"type\":\"string\",\"values\":[\"Changed\"]}," - "\"Type\":{\"type\":\"string\",\"values\":[\"MyProfile\",\"Person\"]}" - "}", - NULL); -} - -void SocialStatusContacts::__updateCb(const char* viewUri, void* userData) -{ - SocialStatusContacts *instance = static_cast(userData); - instance->__handleUpdate(viewUri); -} - -void SocialStatusContacts::__handleUpdate(const char* viewUri) -{ - if (!STR_EQ(viewUri, _contacts_my_profile._uri) && !STR_EQ(viewUri, _contacts_person._uri)) { - _W("Unknown view uri"); - return; - } - - std::string view = (STR_EQ(viewUri, _contacts_my_profile._uri)? SOCIAL_ST_MY_PROFILE : SOCIAL_ST_PERSON); - IF_FAIL_VOID_TAG(!__isConsecutiveChange(viewUri), _D, "Ignore consecutive db change: %s", view.c_str()); - - Json data; - data.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_CHANGED); - data.set(NULL, SOCIAL_ST_TYPE, view); - publish(NULL, ERR_NONE, data); -} - -bool SocialStatusContacts::__isConsecutiveChange(const char* viewUri) -{ - time_t now = time(NULL); - double diff = 0; - - if (STR_EQ(viewUri, MY_PROFILE_VIEW)) { - diff = difftime(now, __latestMyProfile); - __latestMyProfile = now; - } else if (STR_EQ(viewUri, PERSON_VIEW)) { - diff = difftime(now, __latestPerson); - __latestPerson = now; - } - - if (diff < TIME_INTERVAL) - return true; - - return false; -} - -bool SocialStatusContacts::__setCallback() -{ - int err; - - err = contacts_connect(); - IF_FAIL_RETURN_TAG(err == CONTACTS_ERROR_NONE, false, _E, "Connecting contacts failed"); - - err = contacts_db_add_changed_cb(MY_PROFILE_VIEW, __updateCb, this); - IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "Setting my profile view changed callback failed"); - - err = contacts_db_add_changed_cb(PERSON_VIEW, __updateCb, this); - IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "Setting person view changed callback failed"); - - return true; - -CATCH: - contacts_disconnect(); - return false; -} - -void SocialStatusContacts::__unsetCallback() -{ - contacts_db_remove_changed_cb(MY_PROFILE_VIEW, __updateCb, this); - contacts_db_remove_changed_cb(PERSON_VIEW, __updateCb, this); - - contacts_disconnect(); - - __latestMyProfile = 0; - __latestPerson = 0; -} - -int SocialStatusContacts::subscribe() -{ - bool ret = __setCallback(); - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int SocialStatusContacts::unsubscribe() -{ - __unsetCallback(); - return ERR_NONE; -} diff --git a/src/device/social/Contacts.h b/src/device/social/Contacts.h deleted file mode 100644 index c5ced5a..0000000 --- a/src/device/social/Contacts.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_SOCIAL_STATUS_CONTACTS_H_ -#define _CONTEXT_SOCIAL_STATUS_CONTACTS_H_ - -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class SocialStatusContacts : public DeviceProviderBase { - public: - SocialStatusContacts(); - ~SocialStatusContacts(); - - int subscribe(); - int unsubscribe(); - - bool isSupported(); - void submitTriggerItem(); - - private: - time_t __latestMyProfile; - time_t __latestPerson; - - bool __setCallback(); - void __unsetCallback(); - void __handleUpdate(const char* viewUri); - static void __updateCb(const char* viewUri, void* userData); - bool __isConsecutiveChange(const char* viewUri); - }; -} - -#endif // _CONTEXT_SOCIAL_STATUS_CONTACTS_H_ diff --git a/src/device/social/Email.cpp b/src/device/social/Email.cpp deleted file mode 100644 index e67729e..0000000 --- a/src/device/social/Email.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "SocialTypes.h" -#include "Email.h" - -using namespace ctx; - -SocialStatusEmail::SocialStatusEmail() : - DeviceProviderBase(SOCIAL_ST_SUBJ_EMAIL), - __dbusSignalId(-1), - __dbusWatcher(DBusType::SESSION) -{ -} - -SocialStatusEmail::~SocialStatusEmail() -{ -} - -bool SocialStatusEmail::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/network.telephony"); -} - -void SocialStatusEmail::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE, - "{" - "\"Event\":{\"type\":\"string\",\"values\":[\"Received\",\"Sent\"]}" - "}", - NULL); -} - -void SocialStatusEmail::onSignal(const char* sender, const char* path, const char* iface, const char* name, GVariant* param) -{ - gint subType = 0; - gint gi1 = 0; - const gchar *gc = NULL; - gint gi2 = 0; - gint gi3 = 0; - - g_variant_get(param, "(ii&sii)", &subType, &gi1, &gc, &gi2, &gi3); - - if (subType == NOTI_DOWNLOAD_FINISH) { - //TODO: Check if this signal actually means that there are new mails - _D("sub type: %d, gi1: %d, gc: %s, gi2: %d, gi3: %d", subType, gi1, gc, gi2, gi3); - Json dataUpdated; - dataUpdated.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_RECEIVED); - publish(NULL, ERR_NONE, dataUpdated); - - } else if (subType == NOTI_SEND_FINISH) { - _D("sub type: %d, gi1: %d, gc: %s, gi2: %d, gi3: %d", subType, gi1, gc, gi2, gi3); - Json dataUpdated; - dataUpdated.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_SENT); - publish(NULL, ERR_NONE, dataUpdated); - } -} - - -int SocialStatusEmail::subscribe() -{ - __dbusSignalId = __dbusWatcher.watch(NULL, NULL, "User.Email.NetworkStatus", "email", this); - IF_FAIL_RETURN_TAG(__dbusSignalId >= 0, ERR_OPERATION_FAILED, _E, "Email dbus signal subscription failed"); - return ERR_NONE; -} - - -int SocialStatusEmail::unsubscribe() -{ - __dbusWatcher.unwatch(__dbusSignalId); - return ERR_NONE; -} diff --git a/src/device/social/Email.h b/src/device/social/Email.h deleted file mode 100644 index cf44ae7..0000000 --- a/src/device/social/Email.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_EMAIL_H_ -#define _CONTEXT_SOCIAL_STATUS_EMAIL_H_ - -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class SocialStatusEmail : public DeviceProviderBase, public IDBusSignalListener { - public: - SocialStatusEmail(); - ~SocialStatusEmail(); - - int subscribe(); - int unsubscribe(); - - bool isSupported(); - void submitTriggerItem(); - - void onSignal(const char *sender, const char *path, const char *iface, const char *name, GVariant *param); - - private: - int64_t __dbusSignalId; - DBusSignalWatcher __dbusWatcher; - }; -} - -#endif // _CONTEXT_SOCIAL_STATUS_EMAIL_H_ diff --git a/src/device/social/Message.cpp b/src/device/social/Message.cpp deleted file mode 100644 index f55b3e6..0000000 --- a/src/device/social/Message.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "SocialTypes.h" -#include "Message.h" - -#define MAX_ADDR_SIZE 20 - -using namespace ctx; - -SocialStatusMessage::SocialStatusMessage() : - DeviceProviderBase(SOCIAL_ST_SUBJ_MESSAGE), - __messageHandle(NULL) -{ -} - -SocialStatusMessage::~SocialStatusMessage() -{ -} - -bool SocialStatusMessage::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/network.telephony"); -} - -void SocialStatusMessage::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE, - "{" - "\"Event\":{\"type\":\"string\",\"values\":[\"Received\"]}," - "\"Type\":{\"type\":\"string\",\"values\":[\"SMS\",\"MMS\"]}," - "\"Address\":{\"type\":\"string\"}" - "}", - NULL); -} - -void SocialStatusMessage::__updateCb(msg_handle_t handle, msg_struct_t msg, void* userData) -{ - SocialStatusMessage *instance = static_cast(userData); - instance->__handleUpdate(msg); -} - -void SocialStatusMessage::__handleUpdate(msg_struct_t msg) -{ - int err; - int type; - char address[MAX_ADDR_SIZE]; - Json data; - - err = msg_get_int_value(msg, MSG_MESSAGE_TYPE_INT, &type); - IF_FAIL_VOID_TAG(err == MSG_SUCCESS, _W, "Getting message type failed"); - - err = msg_get_str_value(msg, MSG_MESSAGE_REPLY_ADDR_STR, address, MAX_ADDR_SIZE); - IF_FAIL_VOID_TAG(err == MSG_SUCCESS, _W, "Getting reply address failed"); - - switch (type) { - case MSG_TYPE_SMS_CB : - case MSG_TYPE_SMS_JAVACB : - case MSG_TYPE_SMS_WAPPUSH : - case MSG_TYPE_SMS_MWI : - case MSG_TYPE_SMS_SYNCML : - case MSG_TYPE_SMS_REJECT : - case MSG_TYPE_SMS_ETWS_PRIMARY : - case MSG_TYPE_SMS : - data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_SMS); - break; - case MSG_TYPE_MMS_NOTI : - case MSG_TYPE_MMS_JAVA : - case MSG_TYPE_MMS : - data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_MMS); - break; - default : - _W("Unknown message type"); - return; - } - - data.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_RECEIVED); - data.set(NULL, SOCIAL_ST_ADDRESS, address); - - publish(NULL, ERR_NONE, data); -} - -bool SocialStatusMessage::__setCallback() -{ - int err; - - err = msg_open_msg_handle(&__messageHandle); - IF_FAIL_RETURN_TAG(err == MSG_SUCCESS, false, _E, "Handle creation failed"); - - err = msg_reg_sms_message_callback(__messageHandle, __updateCb, 0, this); - if (err != MSG_SUCCESS) { - msg_close_msg_handle(&__messageHandle); - _E("Setting SMS event callback failed"); - return false; - } - - msg_reg_mms_conf_message_callback(__messageHandle, __updateCb, NULL, this); - return true; -} - -void SocialStatusMessage::__unsetCallback() -{ - if (__messageHandle) - msg_close_msg_handle(&__messageHandle); - - __messageHandle = NULL; -} - -int SocialStatusMessage::subscribe() -{ - bool ret = __setCallback(); - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int SocialStatusMessage::unsubscribe() -{ - __unsetCallback(); - return ERR_NONE; -} diff --git a/src/device/social/Message.h b/src/device/social/Message.h deleted file mode 100644 index 78d006b..0000000 --- a/src/device/social/Message.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_SMS_H_ -#define _CONTEXT_SOCIAL_STATUS_SMS_H_ - -#include -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class SocialStatusMessage : public DeviceProviderBase { - public: - SocialStatusMessage(); - ~SocialStatusMessage(); - - int subscribe(); - int unsubscribe(); - - bool isSupported(); - void submitTriggerItem(); - - private: - msg_handle_t __messageHandle; - bool __beingSubscribed; - - bool __setCallback(); - void __unsetCallback(); - void __handleUpdate(msg_struct_t msg); - static void __updateCb(msg_handle_t handle, msg_struct_t msg, void* userData); - }; -} - -#endif // _CONTEXT_SOCIAL_STATUS_SMS_H_ diff --git a/src/device/social/SocialTypes.h b/src/device/social/SocialTypes.h deleted file mode 100644 index 82dccff..0000000 --- a/src/device/social/SocialTypes.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_TYPES_H_ -#define _CONTEXT_SOCIAL_STATUS_TYPES_H_ - -// Subject -#define SOCIAL_ST_SUBJ_CALL "social/call" -#define SOCIAL_ST_SUBJ_EMAIL "social/email" -#define SOCIAL_ST_SUBJ_MESSAGE "social/message" -#define SOCIAL_ST_SUBJ_CONTACTS "social/contacts" - -// Data Key -#define SOCIAL_ST_STATE "State" -#define SOCIAL_ST_EVENT "Event" -#define SOCIAL_ST_TYPE "Type" -#define SOCIAL_ST_MEDIUM "Medium" -#define SOCIAL_ST_ADDRESS "Address" - -// Data Values -#define SOCIAL_ST_IDLE "Idle" -#define SOCIAL_ST_CONNECTING "Connecting" -#define SOCIAL_ST_CONNECTED "Connected" -#define SOCIAL_ST_ACTIVE SOCIAL_ST_CONNECTED -#define SOCIAL_ST_HELD "Held" -#define SOCIAL_ST_DIALING "Dialing" -#define SOCIAL_ST_ALERTING SOCIAL_ST_CONNECTING -#define SOCIAL_ST_INCOMING SOCIAL_ST_CONNECTING -#define SOCIAL_ST_VOICE "Voice" -#define SOCIAL_ST_VIDEO "Video" -#define SOCIAL_ST_SENT "Sent" -#define SOCIAL_ST_RECEIVED "Received" -#define SOCIAL_ST_SMS "SMS" -#define SOCIAL_ST_MMS "MMS" -#define SOCIAL_ST_MY_PROFILE "MyProfile" -#define SOCIAL_ST_PERSON "Person" -#define SOCIAL_ST_CHANGED "Changed" - -#endif //_CONTEXT_SOCIAL_STATUS_TYPES_H diff --git a/src/device/system/Alarm.cpp b/src/device/system/Alarm.cpp deleted file mode 100644 index edc7bad..0000000 --- a/src/device/system/Alarm.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "SystemTypes.h" -#include "Alarm.h" - -using namespace ctx; - -DeviceStatusAlarm::DeviceStatusAlarm() - : ContextProvider(DEVICE_ST_SUBJ_ALARM) -{ -} - -DeviceStatusAlarm::~DeviceStatusAlarm() -{ - __clear(); - - for (auto it = __optionSet.begin(); it != __optionSet.end(); ++it) { - delete *it; - } - __optionSet.clear(); -} - -bool DeviceStatusAlarm::isSupported() -{ - return true; -} - -void DeviceStatusAlarm::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE, - "{" - "\"TimeOfDay\":{\"type\":\"integer\",\"min\":0,\"max\":1439}," - "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}" - "}", - NULL); -} - -int DeviceStatusAlarm::subscribe(Json option, Json *requestResult) -{ - int dow = __getArrangedDayOfWeek(option); - - int time; - for (int i = 0; option.getAt(NULL, DEVICE_ST_TIME_OF_DAY, i, &time); i++) { - __add(time, dow); - } - - Json* elem = new(std::nothrow) Json(option); - if (elem) { - __optionSet.insert(elem); - } else { - unsubscribe(option); - _E("Memory allocation failed"); - return ERR_OUT_OF_MEMORY; - } - - return ERR_NONE; -} - -int DeviceStatusAlarm::unsubscribe(Json option) -{ - int dow = __getArrangedDayOfWeek(option); - - int time; - for (int i = 0; option.getAt(NULL, DEVICE_ST_TIME_OF_DAY, i, &time); i++) { - __remove(time, dow); - } - - OptionSet::iterator target = __findOption(option); - if (target != __optionSet.end()) { - delete (*target); - __optionSet.erase(target); - } - - return ERR_NONE; -} - -int DeviceStatusAlarm::__getArrangedDayOfWeek(Json& option) -{ - int dow = 0; - - std::string tempDay; - for (int i = 0; option.getAt(NULL, DEVICE_ST_DAY_OF_WEEK, i, &tempDay); i++) { - dow |= TimerManager::dowToInt(tempDay); - } - _D("Requested day of week (%#x)", dow); - - return dow; -} - -DeviceStatusAlarm::RefCountArray::RefCountArray() -{ - memset(count, 0, sizeof(int) * DAYS_PER_WEEK); -} - -int DeviceStatusAlarm::__mergeDayOfWeek(int* refCnt) -{ - int dayOfWeek = 0; - - for (int d = 0; d < DAYS_PER_WEEK; ++d) { - if (refCnt[d] > 0) { - dayOfWeek |= (0x01 << d); - } - } - - return dayOfWeek; -} - -bool DeviceStatusAlarm::__add(int minute, int dayOfWeek) -{ - IF_FAIL_RETURN_TAG(minute >=0 && minute < 1440 && - dayOfWeek > 0 && dayOfWeek <= static_cast(DayOfWeek::EVERYDAY), - false, _E, "Invalid parameter"); - - RefCountArray &ref = __refCountMap[minute]; - - for (int d = 0; d < DAYS_PER_WEEK; ++d) { - if ((dayOfWeek & (0x01 << d)) != 0) { - ref.count[d] += 1; - } - } - - return __resetTimer(minute); -} - -bool DeviceStatusAlarm::__remove(int minute, int dayOfWeek) -{ - IF_FAIL_RETURN_TAG(minute >= 0 && minute < 1440 && - dayOfWeek > 0 && dayOfWeek <= static_cast(DayOfWeek::EVERYDAY), - false, _E, "Invalid parameter"); - - RefCountArray &ref = __refCountMap[minute]; - - for (int d = 0; d < DAYS_PER_WEEK; ++d) { - if ((dayOfWeek & (0x01 << d)) != 0 && ref.count[d] > 0) { - ref.count[d] -= 1; - } - } - - return __resetTimer(minute); -} - -bool DeviceStatusAlarm::__resetTimer(int minute) -{ - int dayOfWeek = __mergeDayOfWeek(__refCountMap[minute].count); - TimerState &timer = __timerStateMap[minute]; - - if (dayOfWeek == timer.dayOfWeek) { - /* Necessary timers are already running... */ - return true; - } - - if (dayOfWeek == 0 && timer.timerId > 0) { - /* Turn off the timer at hour, if it is not necessray anymore. */ - __timerManager.remove(timer.timerId); - __timerStateMap.erase(minute); - __refCountMap.erase(minute); - return true; - } - - if (timer.timerId > 0) { - /* Turn off the current timer, to set a new one. */ - __timerManager.remove(timer.timerId); - timer.timerId = -1; - timer.dayOfWeek = 0; - } - - /* Create a new timer, w.r.t. the new dayOfWeek value. */ - int h = minute / 60; - int m = minute - h * 60; - int tid = __timerManager.setAt(h, m, static_cast(dayOfWeek), this); - IF_FAIL_RETURN_TAG(tid > 0, false, _E, "Timer setting failed"); - - timer.timerId = tid; - timer.dayOfWeek = dayOfWeek; - - return true; -} - -void DeviceStatusAlarm::__clear() -{ - for (auto it = __timerStateMap.begin(); it != __timerStateMap.end(); ++it) { - if (it->second.timerId > 0) { - __timerManager.remove(it->second.timerId); - } - } - - __timerStateMap.clear(); - __refCountMap.clear(); -} - -bool DeviceStatusAlarm::onTimerExpired(int timerId) -{ - time_t rawTime; - struct tm timeInfo; - - time(&rawTime); - tzset(); - localtime_r(&rawTime, &timeInfo); - - int hour = timeInfo.tm_hour; - int min = timeInfo.tm_min; - int dayOfWeek = (0x01 << timeInfo.tm_wday); - - __handleUpdate(hour, min, dayOfWeek); - - return true; -} - -void DeviceStatusAlarm::__handleUpdate(int hour, int min, int dayOfWeek) -{ - _I("Time: %02d:%02d, Day of Week: %#x", hour, min, dayOfWeek); - - Json dataRead; - int resultTime = hour * 60 + min; - std::string resultDay = TimerManager::dowToStr(dayOfWeek); - dataRead.set(NULL, DEVICE_ST_TIME_OF_DAY, resultTime); - dataRead.set(NULL, DEVICE_ST_DAY_OF_WEEK, resultDay); - - for (auto it = __optionSet.begin(); it != __optionSet.end(); ++it) { - Json option = (**it); - if (__isMatched(option, resultTime, resultDay)) { - publish(option, ERR_NONE, dataRead); - } - } -} - -bool DeviceStatusAlarm::__isMatched(Json& option, int time, std::string day) -{ - bool ret = false; - int optionTime; - for (int i = 0; option.getAt(NULL, DEVICE_ST_TIME_OF_DAY, i, &optionTime); i++){ - if (time == optionTime) { - ret = true; - break; - } - } - IF_FAIL_RETURN(ret, false); - - std::string optionDay; - for (int i = 0; option.getAt(NULL, DEVICE_ST_DAY_OF_WEEK, i, &optionDay); i++){ - if (day == optionDay) { - return true; - } - } - - return false; -} - -DeviceStatusAlarm::OptionSet::iterator DeviceStatusAlarm::__findOption(Json& option) -{ - for (auto it = __optionSet.begin(); it != __optionSet.end(); ++it) { - if (option == (**it)) - return it; - } - return __optionSet.end(); -} diff --git a/src/device/system/Alarm.h b/src/device/system/Alarm.h deleted file mode 100644 index 5535e5c..0000000 --- a/src/device/system/Alarm.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_ALARM_H_ -#define _DEVICE_SYSTEM_STATUS_ALARM_H_ - -#include -#include -#include -#include - -namespace ctx { - - class DeviceStatusAlarm : public ContextProvider, ITimerListener { - public: - DeviceStatusAlarm(); - ~DeviceStatusAlarm(); - - int subscribe(Json option, Json *requestResult); - int unsubscribe(Json option); - - bool isSupported(); - void submitTriggerItem(); - - protected: - bool onTimerExpired(int timerId); - - private: - struct RefCountArray { - int count[7]; /* reference counts for days of week*/ - RefCountArray(); - }; - - struct TimerState { - int timerId; - int dayOfWeek; /* day of week, merged into one integer */ - TimerState() : timerId(-1), dayOfWeek(0) {} - }; - - typedef std::map RefCountMap; - typedef std::map TimerStateMap; - typedef std::set OptionSet; - - RefCountMap __refCountMap; - TimerStateMap __timerStateMap; - OptionSet __optionSet; - TimerManager __timerManager; - - bool __add(int minute, int dayOfWeek); - bool __remove(int minute, int dayOfWeek); - bool __resetTimer(int hour); - void __clear(); - void __handleUpdate(int hour, int min, int dayOfWeek); - - int __getArrangedDayOfWeek(Json& option); - int __mergeDayOfWeek(int *refCnt); - - bool __isMatched(Json& option, int time, std::string day); - OptionSet::iterator __findOption(Json& option); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_ALARM_H_ diff --git a/src/device/system/Battery.cpp b/src/device/system/Battery.cpp deleted file mode 100644 index 94c3d58..0000000 --- a/src/device/system/Battery.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "SystemTypes.h" -#include "Battery.h" - -using namespace ctx; - -DeviceStatusBattery::DeviceStatusBattery() - : DeviceProviderBase(DEVICE_ST_SUBJ_BATTERY) -{ -} - -DeviceStatusBattery::~DeviceStatusBattery() -{ -} - -bool DeviceStatusBattery::isSupported() -{ - return true; -} - -void DeviceStatusBattery::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" - "\"Level\":{\"type\":\"string\",\"values\":[\"Empty\",\"Critical\",\"Low\",\"Normal\",\"High\",\"Full\"]}," - TRIG_BOOL_ITEM_DEF("IsCharging") - "}", - NULL); -} - -void DeviceStatusBattery::__updateCb(device_callback_e deviceType, void* value, void* userData) -{ - IF_FAIL_VOID(deviceType == DEVICE_CALLBACK_BATTERY_LEVEL); - - DeviceStatusBattery *instance = static_cast(userData); - instance->__handleUpdate(deviceType, value); -} - -void DeviceStatusBattery::__handleUpdate(device_callback_e deviceType, void* value) -{ - intptr_t level = (intptr_t)value; - - const char* levelString = __transToString(level); - IF_FAIL_VOID(levelString); - - Json dataRead; - dataRead.set(NULL, DEVICE_ST_LEVEL, levelString); - - bool chargingState = false; - int ret = device_battery_is_charging(&chargingState); - IF_FAIL_VOID_TAG(ret == DEVICE_ERROR_NONE, _E, "Getting state failed"); - - dataRead.set(NULL, DEVICE_ST_IS_CHARGING, chargingState ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - publish(NULL, ERR_NONE, dataRead); -} - -const char* DeviceStatusBattery::__transToString(intptr_t level) -{ - switch (level) { - case DEVICE_BATTERY_LEVEL_EMPTY: - return DEVICE_ST_EMPTY; - - case DEVICE_BATTERY_LEVEL_CRITICAL: - return DEVICE_ST_CRITICAL; - - case DEVICE_BATTERY_LEVEL_LOW: - return DEVICE_ST_LOW; - - case DEVICE_BATTERY_LEVEL_HIGH: - return DEVICE_ST_NORMAL; - - case DEVICE_BATTERY_LEVEL_FULL: - { - int percent; - device_battery_get_percent(&percent); - - if (percent == 100) { - return DEVICE_ST_FULL; - } else { - return DEVICE_ST_HIGH; - } - break; - } - - default: - _E("Invalid battery level"); - return NULL; - } -} - -int DeviceStatusBattery::subscribe() -{ - int ret = device_add_callback(DEVICE_CALLBACK_BATTERY_LEVEL, __updateCb, this); - IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int DeviceStatusBattery::unsubscribe() -{ - int ret = device_remove_callback(DEVICE_CALLBACK_BATTERY_LEVEL, __updateCb); - IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int DeviceStatusBattery::read() -{ - device_battery_level_e level; - Json dataRead; - - int ret = device_battery_get_level_status(&level); - IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); - - const char* levelString = __transToString(level); - IF_FAIL_RETURN(levelString, ERR_OPERATION_FAILED); - - dataRead.set(NULL, DEVICE_ST_LEVEL, levelString); - - bool chargingState = false; - ret = device_battery_is_charging(&chargingState); - IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); - - dataRead.set(NULL, DEVICE_ST_IS_CHARGING, chargingState ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - - replyToRead(NULL, ERR_NONE, dataRead); - return ERR_NONE; -} diff --git a/src/device/system/Battery.h b/src/device/system/Battery.h deleted file mode 100644 index d016798..0000000 --- a/src/device/system/Battery.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_BATTERY_H_ -#define _DEVICE_SYSTEM_STATUS_BATTERY_H_ - -#include -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class DeviceStatusBattery : public DeviceProviderBase { - public: - DeviceStatusBattery(); - ~DeviceStatusBattery(); - - int subscribe(); - int unsubscribe(); - int read(); - - bool isSupported(); - void submitTriggerItem(); - - private: - const char* __transToString(intptr_t level); - void __handleUpdate(device_callback_e deviceType, void* value); - static void __updateCb(device_callback_e deviceType, void* value, void* userData); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_BATTERY_H_ diff --git a/src/device/system/Headphone.cpp b/src/device/system/Headphone.cpp deleted file mode 100644 index 0093af9..0000000 --- a/src/device/system/Headphone.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "SystemTypes.h" -#include "Headphone.h" - -#define HANDLING_DELAY 2000 -#define MAX_HANDLING_COUNT 3 - -using namespace ctx; - -DeviceStatusHeadphone::DeviceStatusHeadphone() : - DeviceProviderBase(DEVICE_ST_SUBJ_HEADPHONE), - __connected(false), - __audioJackState(RUNTIME_INFO_AUDIO_JACK_STATUS_UNCONNECTED), - __btAudioState(false), - __btAudioCallbackOn(false), - __btEventHandlerAdded(false), - __btEventHandlingCount(0) -{ -} - -DeviceStatusHeadphone::~DeviceStatusHeadphone() -{ -} - -bool DeviceStatusHeadphone::isSupported() -{ - return true; -} - -void DeviceStatusHeadphone::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" - TRIG_BOOL_ITEM_DEF("IsConnected") "," - "\"Type\":{\"type\":\"string\",\"values\":[\"Normal\",\"Headset\",\"Bluetooth\"]}" - "}", - NULL); -} - -int DeviceStatusHeadphone::subscribe() -{ - __connected = __getCurrentStatus(); - - // Wired headphone - int ret = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, __onAudioJackStateChanged, this); - IF_FAIL_RETURN(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED); - - // Bluetooth headphone - __setBtAudioCallback(); - - return ERR_NONE; -} - -int DeviceStatusHeadphone::unsubscribe() -{ - runtime_info_unset_changed_cb(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS); - __unsetBtAudioCallback(); - - return ERR_NONE; -} - -int DeviceStatusHeadphone::read() -{ - if (!__beingSubscribed) - __connected = __getCurrentStatus(); - - Json data; - __generateDataPacket(&data); - replyToRead(NULL, ERR_NONE, data); - - return ERR_NONE; -} - -void DeviceStatusHeadphone::__setBtAudioCallback() -{ - IF_FAIL_VOID(!__btAudioCallbackOn); - int ret; - - ret = bt_initialize(); - if (ret != BT_ERROR_NONE) { - _W("Bluetooth initialization failed"); - return; - } - - ret = bt_device_set_connection_state_changed_cb(__onBtConnectionChanged, this); - if (ret != BT_ERROR_NONE) { - bt_deinitialize(); - return; - } - - __btAudioCallbackOn = true; -} - -void DeviceStatusHeadphone::__unsetBtAudioCallback() -{ - IF_FAIL_VOID(__btAudioCallbackOn); - - bt_device_unset_connection_state_changed_cb(); - bt_deinitialize(); - - __btAudioCallbackOn = false; -} - -void DeviceStatusHeadphone::__setBtAudioState(bool state) -{ - __btAudioState = state; -} - -bool DeviceStatusHeadphone::__getCurrentStatus() -{ - int ret; - - // Wired audio - ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, &__audioJackState); - IF_FAIL_RETURN(ret == ERR_NONE, __connected); - - // Bluetooth audio - __btAudioState = false; - ret = bt_initialize(); - if (ret == BT_ERROR_NONE) { - bt_adapter_foreach_bonded_device(__onBtBond, this); - bt_deinitialize(); - } - - return ((__audioJackState != RUNTIME_INFO_AUDIO_JACK_STATUS_UNCONNECTED) || __btAudioState); -} - -void DeviceStatusHeadphone::__generateDataPacket(Json* data) -{ - data->set(NULL, DEVICE_ST_IS_CONNECTED, __connected ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - - switch (__audioJackState) { - case RUNTIME_INFO_AUDIO_JACK_STATUS_CONNECTED_3WIRE: - data->set(NULL, DEVICE_ST_TYPE, DEVICE_ST_NORMAL); - break; - case RUNTIME_INFO_AUDIO_JACK_STATUS_CONNECTED_4WIRE: - data->set(NULL, DEVICE_ST_TYPE, DEVICE_ST_HEADSET); - break; - default: - if (__btAudioState) - data->set(NULL, DEVICE_ST_TYPE, DEVICE_ST_BLUETOOTH); - break; - } -} - -bool DeviceStatusHeadphone::__handleUpdate() -{ - bool prevState = __connected; - __connected = ((__audioJackState != RUNTIME_INFO_AUDIO_JACK_STATUS_UNCONNECTED) || __btAudioState); - - IF_FAIL_RETURN(prevState != __connected, false); - - Json data; - __generateDataPacket(&data); - publish(NULL, ERR_NONE, data); - return true; -} - -void DeviceStatusHeadphone::__handleAudioJackEvent() -{ - int ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, &__audioJackState); - IF_FAIL_VOID_TAG(ret == ERR_NONE, _E, "Getting runtime info failed"); - __handleUpdate(); -} - -void DeviceStatusHeadphone::__onAudioJackStateChanged(runtime_info_key_e runtimeKey, void* userData) -{ - _D("EarJack"); - DeviceStatusHeadphone *instance = static_cast(userData); - instance->__handleAudioJackEvent(); -} - -void DeviceStatusHeadphone::__onBtConnectionChanged(bool connected, bt_device_connection_info_s *connInfo, void *userData) -{ - DeviceStatusHeadphone *instance = static_cast(userData); - IF_FAIL_VOID(connected != instance->__btAudioState); - IF_FAIL_VOID(!instance->__btEventHandlerAdded); - - if (connected) { - _D("BT state checking scheduled"); - instance->__btEventHandlerAdded = true; - instance->__btEventHandlingCount = 0; - g_timeout_add(HANDLING_DELAY, __handleBtEvent, userData); - } else { - __handleBtEvent(userData); - } -} - -gboolean DeviceStatusHeadphone::__handleBtEvent(gpointer data) -{ - _D("BT state checking started"); - DeviceStatusHeadphone *instance = static_cast(data); - instance->__btEventHandlerAdded = false; - - instance->__setBtAudioState(false); - int err = bt_adapter_foreach_bonded_device(__onBtBond, data); - IF_FAIL_RETURN_TAG(err == BT_ERROR_NONE, FALSE, _E, "bt_adapter_foreach_bonded_device() failed"); - - instance->__btEventHandlingCount++; - - if (instance->__handleUpdate() || instance->__btEventHandlingCount >= MAX_HANDLING_COUNT) - return FALSE; - - return TRUE; -} - -bool DeviceStatusHeadphone::__onBtBond(bt_device_info_s *deviceInfo, void* userData) -{ - if (deviceInfo->bt_class.major_device_class != BT_MAJOR_DEVICE_CLASS_AUDIO_VIDEO) - return true; - - bool st = false; - int err = bt_device_is_profile_connected(deviceInfo->remote_address, BT_PROFILE_A2DP, &st); - IF_FAIL_RETURN_TAG(err == BT_ERROR_NONE, false, _E, "bt_device_is_profile_connected() failed"); - - if (st) { - DeviceStatusHeadphone *instance = static_cast(userData); - instance->__setBtAudioState(true); - return false; - } - - return true; -} diff --git a/src/device/system/Headphone.h b/src/device/system/Headphone.h deleted file mode 100644 index 00edcfd..0000000 --- a/src/device/system/Headphone.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_HEADPHONE_H_ -#define _DEVICE_STATUS_HEADPNOHE_H_ - -#include -#include -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class DeviceStatusHeadphone : public DeviceProviderBase { - public: - DeviceStatusHeadphone(); - ~DeviceStatusHeadphone(); - - int subscribe(); - int unsubscribe(); - int read(); - - bool isSupported(); - void submitTriggerItem(); - - private: - bool __connected; - int __audioJackState; - bool __btAudioState; - bool __btAudioCallbackOn; - bool __btEventHandlerAdded; - int __btEventHandlingCount; - - bool __getCurrentStatus(); - void __setBtAudioCallback(); - void __unsetBtAudioCallback(); - void __setBtAudioState(bool state); - - void __generateDataPacket(Json* data); - bool __handleUpdate(); - void __handleAudioJackEvent(); - static gboolean __handleBtEvent(gpointer data); - - static void __onAudioJackStateChanged(runtime_info_key_e runtimeKey, void* userData); - static void __onBtConnectionChanged(bool connected, bt_device_connection_info_s *connInfo, void *userData); - static bool __onBtBond(bt_device_info_s *deviceInfo, void* userData); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_HEADPHONE_H_ diff --git a/src/device/system/Psmode.cpp b/src/device/system/Psmode.cpp deleted file mode 100644 index c52b176..0000000 --- a/src/device/system/Psmode.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "SystemTypes.h" -#include "Psmode.h" - -using namespace ctx; - -DeviceStatusPsmode::DeviceStatusPsmode() : - DeviceProviderBase(DEVICE_ST_SUBJ_PSMODE) -{ -} - -DeviceStatusPsmode::~DeviceStatusPsmode() -{ -} - -bool DeviceStatusPsmode::isSupported() -{ - return true; -} - -void DeviceStatusPsmode::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" TRIG_BOOL_ITEM_DEF("IsEnabled") "}", NULL); -} - -void DeviceStatusPsmode::__updateCb(keynode_t *node, void* userData) -{ - DeviceStatusPsmode *instance = static_cast(userData); - instance->__handleUpdate(node); -} - -void DeviceStatusPsmode::__handleUpdate(keynode_t *node) -{ - int status; - Json dataRead; - - status = vconf_keynode_get_int(node); - IF_FAIL_VOID_TAG(status >= 0, _E, "Getting state failed"); - - dataRead.set(NULL, DEVICE_ST_IS_ENABLED, status == 0 ? DEVICE_ST_FALSE : DEVICE_ST_TRUE); - - publish(NULL, ERR_NONE, dataRead); -} - -int DeviceStatusPsmode::subscribe() -{ - int ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, __updateCb, this); - IF_FAIL_RETURN(ret == VCONF_OK, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int DeviceStatusPsmode::unsubscribe() -{ - int ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE, __updateCb); - IF_FAIL_RETURN(ret == VCONF_OK, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int DeviceStatusPsmode::read() -{ - int mode; - int ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &mode); - IF_FAIL_RETURN(ret == VCONF_OK, ERR_OPERATION_FAILED); - - Json dataRead; - dataRead.set(NULL, DEVICE_ST_IS_ENABLED, mode == 0 ? DEVICE_ST_FALSE : DEVICE_ST_TRUE); - - replyToRead(NULL, ERR_NONE, dataRead); - return ERR_NONE; -} diff --git a/src/device/system/Psmode.h b/src/device/system/Psmode.h deleted file mode 100644 index d324ac3..0000000 --- a/src/device/system/Psmode.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_POWER_SAVING_MODE_H_ -#define _DEVICE_SYSTEM_STATUS_POWER_SAVING_MODE_H_ - -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class DeviceStatusPsmode : public DeviceProviderBase { - public: - DeviceStatusPsmode(); - ~DeviceStatusPsmode(); - - int subscribe(); - int unsubscribe(); - int read(); - - bool isSupported(); - void submitTriggerItem(); - - private: - void __handleUpdate(keynode_t *node); - static void __updateCb(keynode_t *node, void* userData); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_POWER_SAVING_MODE_H_ diff --git a/src/device/system/SystemTypes.h b/src/device/system/SystemTypes.h deleted file mode 100644 index 3129a36..0000000 --- a/src/device/system/SystemTypes.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_TYPES_H_ -#define _DEVICE_SYSTEM_STATUS_TYPES_H_ - -// Subject -#define DEVICE_ST_SUBJ_BATTERY "system/battery" -#define DEVICE_ST_SUBJ_CHARGER "system/charger" -#define DEVICE_ST_SUBJ_HEADPHONE "system/headphone" -#define DEVICE_ST_SUBJ_WIFI "system/wifi" -#define DEVICE_ST_SUBJ_USB "system/usb" -#define DEVICE_ST_SUBJ_GPS "system/gps" -#define DEVICE_ST_SUBJ_PSMODE "system/psmode" -#define DEVICE_ST_SUBJ_ALARM "device/alarm" -#define DEVICE_ST_SUBJ_TIME "device/time" - -// Data Key -#define DEVICE_ST_EVENT "Event" -#define DEVICE_ST_STATE "State" -#define DEVICE_ST_TYPE "Type" -#define DEVICE_ST_LEVEL "Level" -#define DEVICE_ST_BSSID "BSSID" -#define DEVICE_ST_IS_CONNECTED "IsConnected" -#define DEVICE_ST_IS_ENABLED "IsEnabled" -#define DEVICE_ST_IS_CHARGING "IsCharging" -#define DEVICE_ST_DETECTED "Detected" -#define DEVICE_ST_TIME_OF_DAY "TimeOfDay" -#define DEVICE_ST_DAY_OF_WEEK "DayOfWeek" -#define DEVICE_ST_DAY_OF_MONTH "DayOfMonth" - -// Data Value -#define DEVICE_ST_TRUE 1 -#define DEVICE_ST_FALSE 0 -#define DEVICE_ST_ENTER "Enter" -#define DEVICE_ST_EXIT "Exit" -#define DEVICE_ST_DISABLED "Disabled" -#define DEVICE_ST_CONNECTED "Connected" -#define DEVICE_ST_UNCONNECTED "Unconnected" -#define DEVICE_ST_SEARCHING "Searching" -#define DEVICE_ST_EMPTY "Empty" -#define DEVICE_ST_CRITICAL "Critical" -#define DEVICE_ST_LOW "Low" -#define DEVICE_ST_NORMAL "Normal" -#define DEVICE_ST_HIGH "High" -#define DEVICE_ST_FULL "Full" -#define DEVICE_ST_HEADSET "Headset" -#define DEVICE_ST_BLUETOOTH "Bluetooth" - -#define TRIG_BOOL_ITEM_DEF(sbj) "\"" sbj "\":{\"type\":\"integer\",\"min\":0,\"max\":1}" - -#endif //_DEVICE_SYSTEM_STATUS_TYPES_H_ diff --git a/src/device/system/Time.cpp b/src/device/system/Time.cpp deleted file mode 100644 index 6fa0c81..0000000 --- a/src/device/system/Time.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "SystemTypes.h" -#include "Time.h" - -using namespace ctx; - -DeviceStatusTime::DeviceStatusTime() : - DeviceProviderBase(DEVICE_ST_SUBJ_TIME) -{ -} - -DeviceStatusTime::~DeviceStatusTime() -{ -} - -bool DeviceStatusTime::isSupported() -{ - return true; -} - -void DeviceStatusTime::submitTriggerItem() -{ - registerTriggerItem(OPS_READ, - "{" - "\"TimeOfDay\":{\"type\":\"integer\",\"min\":0,\"max\":1439}," - "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}," - "\"DayOfMonth\":{\"type\":\"integer\",\"min\":1,\"max\":31}" - "}", - NULL); -} - -int DeviceStatusTime::subscribe() -{ - return ERR_NOT_SUPPORTED; -} - -int DeviceStatusTime::unsubscribe() -{ - return ERR_NOT_SUPPORTED; -} - -int DeviceStatusTime::read() -{ - time_t rawtime; - struct tm timeInfo; - - time(&rawtime); - tzset(); - localtime_r(&rawtime, &timeInfo); - - int dayOfMonth = timeInfo.tm_mday; - int minuteOfDay = timeInfo.tm_hour * 60 + timeInfo.tm_min; - std::string dayOfWeek = TimerManager::dowToStr(0x01 << timeInfo.tm_wday); - - Json dataRead; - dataRead.set(NULL, DEVICE_ST_DAY_OF_MONTH, dayOfMonth); - dataRead.set(NULL, DEVICE_ST_DAY_OF_WEEK, dayOfWeek); - dataRead.set(NULL, DEVICE_ST_TIME_OF_DAY, minuteOfDay); - - _I("Time: %02d:%02d, Day of Week: %s, Day of Month: %d", timeInfo.tm_hour, timeInfo.tm_min, dayOfWeek.c_str(), dayOfMonth); - - replyToRead(NULL, ERR_NONE, dataRead); - - return ERR_NONE; -} diff --git a/src/device/system/Time.h b/src/device/system/Time.h deleted file mode 100644 index e5e1112..0000000 --- a/src/device/system/Time.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_TIME_H_ -#define _DEVICE_SYSTEM_STATUS_TIME_H_ - -#include "../DeviceProviderBase.h" - -namespace ctx { - - class DeviceStatusTime : public DeviceProviderBase { - public: - DeviceStatusTime(); - ~DeviceStatusTime(); - - int subscribe(); - int unsubscribe(); - int read(); - - bool isSupported(); - void submitTriggerItem(); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_TIME_H_ diff --git a/src/device/system/Wifi.cpp b/src/device/system/Wifi.cpp deleted file mode 100644 index 5f6cca7..0000000 --- a/src/device/system/Wifi.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "SystemTypes.h" -#include "Wifi.h" - -using namespace ctx; - -DeviceStatusWifi::DeviceStatusWifi() : - DeviceProviderBase(DEVICE_ST_SUBJ_WIFI), - __lastState(UNKNOWN), - __isInitialized(false), - __isActivated(false), - __connState(WIFI_CONNECTION_STATE_FAILURE) -{ - IF_FAIL_VOID_TAG(__startMonitor(), _W, "WiFi monitor initialization failed"); - - if (!__getCurrentState()) { - __stopMonitor(); - _W("Getting current WiFi status failed"); - } -} - -DeviceStatusWifi::~DeviceStatusWifi() -{ - __stopMonitor(); -} - -bool DeviceStatusWifi::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/network.wifi"); -} - -void DeviceStatusWifi::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" - "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Unconnected\",\"Connected\"]}," - "\"BSSID\":{\"type\":\"string\"}" - "}", - NULL); -} - -bool DeviceStatusWifi::__getCurrentState() -{ - int err; - - if (!__isInitialized) { - err = wifi_initialize(); - IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_initialize() failed"); - } - - err = wifi_is_activated(&__isActivated); - IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_is_activated() failed"); - - err = wifi_get_connection_state(&__connState); - IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_get_connection_state() failed"); - - if (__isActivated) { - if (__connState == WIFI_CONNECTION_STATE_CONNECTED) { - __lastState = CONNECTED; - __getBssid(); - } else { - __lastState = UNCONNECTED; - __clearBssid(); - } - } else { - __lastState = DISABLED; - __clearBssid(); - } - - if (!__isInitialized) - wifi_deinitialize(); - - return true; -} - -bool DeviceStatusWifi::__getBssid() -{ - int err; - char *strBuf = NULL; - wifi_ap_h ap = NULL; - - err = wifi_get_connected_ap(&ap); - IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_get_connected_ap() failed"); - - wifi_ap_get_bssid(ap, &strBuf); - __bssid = (strBuf != NULL ? strBuf : ""); - g_free(strBuf); - - wifi_ap_destroy(ap); - - if (__bssid.empty()) - _W("Failed to get BSSID"); - - SharedVars().set(SharedVars::WIFI_BSSID, __bssid); - _D("BSSID: %s", __bssid.c_str()); - - return !__bssid.empty(); -} - -void DeviceStatusWifi::__clearBssid() -{ - __bssid.clear(); - SharedVars().clear(SharedVars::WIFI_BSSID); - _D("No WiFi connection"); -} - -bool DeviceStatusWifi::__getResponsePacket(Json* data) -{ - switch (__lastState) { - case DISABLED: - data->set(NULL, DEVICE_ST_STATE, DEVICE_ST_DISABLED); - break; - - case UNCONNECTED: - data->set(NULL, DEVICE_ST_STATE, DEVICE_ST_UNCONNECTED); - break; - - case CONNECTED: - data->set(NULL, DEVICE_ST_STATE, DEVICE_ST_CONNECTED); - data->set(NULL, DEVICE_ST_BSSID, __bssid); - break; - - default: - return false; - } - - return true; -} - -int DeviceStatusWifi::read() -{ - IF_FAIL_RETURN(__getCurrentState(), ERR_OPERATION_FAILED); - - Json dataRead; - if (__getResponsePacket(&dataRead)) { - replyToRead(NULL, ERR_NONE, dataRead); - return ERR_NONE; - } - - return ERR_OPERATION_FAILED; -} - -bool DeviceStatusWifi::__startMonitor() -{ - IF_FAIL_RETURN(!__isInitialized, true); - - int err; - err = wifi_initialize(); - IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_initialize() failed"); - - err = wifi_set_device_state_changed_cb(__deviceStateChangedCb, this); - IF_FAIL_CATCH_TAG(err == WIFI_ERROR_NONE, _E, "wifi_set_device_state_changed_cb() failed"); - - err = wifi_set_connection_state_changed_cb(__connectionStateChangedCb, this); - IF_FAIL_CATCH_TAG(err == WIFI_ERROR_NONE, _E, "wifi_set_connection_state_changed_cb() failed"); - - __isInitialized = true; - return true; - -CATCH: - wifi_deinitialize(); - return false; -} - -void DeviceStatusWifi::__stopMonitor() -{ - IF_FAIL_VOID(__isInitialized); - - wifi_unset_device_state_changed_cb(); - wifi_unset_connection_state_changed_cb(); - wifi_deinitialize(); - __isInitialized = false; -} - -int DeviceStatusWifi::subscribe() -{ -#if 0 - IF_FAIL_RETURN(__startMonitor(), ERR_OPERATION_FAILED); - if (!__getCurrentState()) { - __stopMonitor(); - return ERR_OPERATION_FAILED; - } -#endif - - return ERR_NONE; -} - -int DeviceStatusWifi::unsubscribe() -{ -#if 0 - __stopMonitor(); -#endif - return ERR_NONE; -} - -void DeviceStatusWifi::__handleUpdate() -{ - int prevState = __lastState; - - if (__isActivated) { - if (__connState == WIFI_CONNECTION_STATE_CONNECTED) { - __lastState = CONNECTED; - } else { - __lastState = UNCONNECTED; - } - } else { - __lastState = DISABLED; - } - - if (__lastState != prevState) { - if (__lastState == CONNECTED) { - __getBssid(); - } else { - __clearBssid(); - } - - Json data; - if (__beingSubscribed && __getResponsePacket(&data)) - publish(NULL, ERR_NONE, data); - } -} - -void DeviceStatusWifi::__deviceStateChangedCb(wifi_device_state_e state, void *userData) -{ - DeviceStatusWifi *instance = static_cast(userData); - instance->__isActivated = (state == WIFI_DEVICE_STATE_ACTIVATED); - instance->__handleUpdate(); -} - -void DeviceStatusWifi::__connectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData) -{ - DeviceStatusWifi *instance = static_cast(userData); - instance->__connState = state; - instance->__handleUpdate(); -} diff --git a/src/device/system/Wifi.h b/src/device/system/Wifi.h deleted file mode 100644 index 82cebb2..0000000 --- a/src/device/system/Wifi.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_WIFI_H_ -#define _DEVICE_SYSTEM_STATUS_WIFI_H_ - -#include -#include -#include "../DeviceProviderBase.h" - -namespace ctx { - - class DeviceStatusWifi : public DeviceProviderBase { - public: - DeviceStatusWifi(); - ~DeviceStatusWifi(); - - int subscribe(); - int unsubscribe(); - int read(); - - bool isSupported(); - void submitTriggerItem(); - - private: - enum InternalState { - UNKNOWN = -1, - DISABLED = 0, - UNCONNECTED, - CONNECTED, - }; - - int __lastState; - bool __isInitialized; - bool __isActivated; - wifi_connection_state_e __connState; - std::string __bssid; - - bool __getCurrentState(); - bool __getBssid(); - void __clearBssid(); - bool __getResponsePacket(Json* data); - void __handleUpdate(); - bool __startMonitor(); - void __stopMonitor(); - static void __deviceStateChangedCb(wifi_device_state_e state, void *userData); - static void __connectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData); - }; -} - -#endif // _CONTEXT_SYSTEM_STATUS_WIFI_H_ diff --git a/src/device/system/runtime_info/Charger.cpp b/src/device/system/runtime_info/Charger.cpp deleted file mode 100644 index 8cdf40a..0000000 --- a/src/device/system/runtime_info/Charger.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "../SystemTypes.h" -#include "Charger.h" - -using namespace ctx; - -DeviceStatusCharger::DeviceStatusCharger() : - DeviceStatusRuntimeInfo(DEVICE_ST_SUBJ_CHARGER, RUNTIME_INFO_KEY_CHARGER_CONNECTED) -{ -} - -DeviceStatusCharger::~DeviceStatusCharger() -{ -} - -bool DeviceStatusCharger::isSupported() -{ - return true; -} - -void DeviceStatusCharger::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" TRIG_BOOL_ITEM_DEF("IsConnected") "}", NULL); -} - -void DeviceStatusCharger::handleUpdate() -{ - bool chargerStatus = false; - - int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_CHARGER_CONNECTED, &chargerStatus); - IF_FAIL_VOID_TAG(ret == RUNTIME_INFO_ERROR_NONE, _E, "Getting runtime info failed"); - - Json dataRead; - dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, chargerStatus ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - - publish(NULL, ERR_NONE, dataRead); -} - -int DeviceStatusCharger::read() -{ - bool chargerStatus = false; - Json dataRead; - - int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_CHARGER_CONNECTED, &chargerStatus); - IF_FAIL_RETURN_TAG(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting runtime info failed"); - - dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, chargerStatus ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - - replyToRead(NULL, ERR_NONE, dataRead); - return ERR_NONE; -} diff --git a/src/device/system/runtime_info/Charger.h b/src/device/system/runtime_info/Charger.h deleted file mode 100644 index a6746a3..0000000 --- a/src/device/system/runtime_info/Charger.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_CHARGER_ -#define _DEVICE_SYSTEM_STATUS_CHARGER_ - -#include "RuntimeInfoBase.h" - -namespace ctx { - - class DeviceStatusCharger : public DeviceStatusRuntimeInfo { - public: - DeviceStatusCharger(); - ~DeviceStatusCharger(); - - int read(); - - bool isSupported(); - void submitTriggerItem(); - - protected: - void handleUpdate(); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_CHARGER_H_ diff --git a/src/device/system/runtime_info/Gps.cpp b/src/device/system/runtime_info/Gps.cpp deleted file mode 100644 index d2bc301..0000000 --- a/src/device/system/runtime_info/Gps.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "../SystemTypes.h" -#include "Gps.h" - -using namespace ctx; - -static const char* __getStatusString(int gpsStatus) -{ - switch (gpsStatus) { - case RUNTIME_INFO_GPS_STATUS_DISABLED: - return DEVICE_ST_DISABLED; - - case RUNTIME_INFO_GPS_STATUS_SEARCHING: - return DEVICE_ST_SEARCHING; - - case RUNTIME_INFO_GPS_STATUS_CONNECTED: - return DEVICE_ST_CONNECTED; - - default: - _E("Unknown GPS status: %d", gpsStatus); - return NULL; - } -} - -DeviceStatusGps::DeviceStatusGps() : - DeviceStatusRuntimeInfo(DEVICE_ST_SUBJ_GPS, RUNTIME_INFO_KEY_GPS_STATUS) -{ -} - -DeviceStatusGps::~DeviceStatusGps() -{ -} - -bool DeviceStatusGps::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/location.gps"); -} - -void DeviceStatusGps::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" - "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Searching\",\"Connected\"]}" - "}", - NULL); -} - -void DeviceStatusGps::handleUpdate() -{ - int gpsStatus; - int ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_GPS_STATUS, &gpsStatus); - IF_FAIL_VOID_TAG(ret == RUNTIME_INFO_ERROR_NONE, _E, "Getting runtime info failed"); - - Json dataRead; - - const char* stateStr = __getStatusString(gpsStatus); - IF_FAIL_VOID(stateStr); - - dataRead.set(NULL, DEVICE_ST_STATE, stateStr); - - publish(NULL, ERR_NONE, dataRead); -} - -int DeviceStatusGps::read() -{ - int gpsStatus; - Json dataRead; - - int ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_GPS_STATUS, &gpsStatus); - IF_FAIL_RETURN_TAG(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting runtime info failed"); - - const char* stateStr = __getStatusString(gpsStatus); - IF_FAIL_RETURN(stateStr, ERR_OPERATION_FAILED); - - dataRead.set(NULL, DEVICE_ST_STATE, stateStr); - - replyToRead(NULL, ERR_NONE, dataRead); - return ERR_NONE; -} diff --git a/src/device/system/runtime_info/Gps.h b/src/device/system/runtime_info/Gps.h deleted file mode 100644 index 87acd1b..0000000 --- a/src/device/system/runtime_info/Gps.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_GPS_H_ -#define _DEVICE_SYSTEM_STATUS_GPS_H_ - -#include "RuntimeInfoBase.h" - -namespace ctx { - - class DeviceStatusGps : public DeviceStatusRuntimeInfo { - public: - DeviceStatusGps(); - ~DeviceStatusGps(); - - int read(); - - bool isSupported(); - void submitTriggerItem(); - - protected: - void handleUpdate(); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_GPS_H_ diff --git a/src/device/system/runtime_info/RuntimeInfoBase.cpp b/src/device/system/runtime_info/RuntimeInfoBase.cpp deleted file mode 100644 index 1f745ad..0000000 --- a/src/device/system/runtime_info/RuntimeInfoBase.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "RuntimeInfoBase.h" - -using namespace ctx; - -DeviceStatusRuntimeInfo::DeviceStatusRuntimeInfo(const char *subject, runtime_info_key_e key) : - DeviceProviderBase(subject), - __infoKey(key) -{ -} - -runtime_info_key_e DeviceStatusRuntimeInfo::__getInfoKey() -{ - return __infoKey; -} - -void DeviceStatusRuntimeInfo::updateCb(runtime_info_key_e runtimeKey, void* userData) -{ - DeviceStatusRuntimeInfo *instance = static_cast(userData); - IF_FAIL_VOID_TAG(runtimeKey == instance->__getInfoKey(), _W, "Runtime info key mismatch"); - instance->handleUpdate(); -} - -int DeviceStatusRuntimeInfo::subscribe() -{ - int ret = runtime_info_set_changed_cb(__infoKey, updateCb, this); - IF_FAIL_RETURN(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED); - return ERR_NONE; -} - -int DeviceStatusRuntimeInfo::unsubscribe() -{ - int ret = runtime_info_unset_changed_cb(__infoKey); - IF_FAIL_RETURN(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED); - return ERR_NONE; -} diff --git a/src/device/system/runtime_info/RuntimeInfoBase.h b/src/device/system/runtime_info/RuntimeInfoBase.h deleted file mode 100644 index a2e4a88..0000000 --- a/src/device/system/runtime_info/RuntimeInfoBase.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_RUNTIME_INFO_BASE_H_ -#define _DEVICE_SYSTEM_STATUS_RUNTIME_INFO_BASE_H_ - -#include -#include "../../DeviceProviderBase.h" - -namespace ctx { - - class DeviceStatusRuntimeInfo : public DeviceProviderBase { - public: - DeviceStatusRuntimeInfo(const char *subject, runtime_info_key_e key); - - int subscribe(); - int unsubscribe(); - virtual int read() = 0; - - protected: - runtime_info_key_e __infoKey; - - virtual ~DeviceStatusRuntimeInfo(){} - static void updateCb(runtime_info_key_e runtimeKey, void* userData); - virtual void handleUpdate() = 0; - - private: - runtime_info_key_e __getInfoKey(); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_RUNTIME_INFO_BASE_H_ diff --git a/src/device/system/runtime_info/Usb.cpp b/src/device/system/runtime_info/Usb.cpp deleted file mode 100644 index e0aa6af..0000000 --- a/src/device/system/runtime_info/Usb.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "../SystemTypes.h" -#include "Usb.h" - -using namespace ctx; - -DeviceStatusUsb::DeviceStatusUsb() : - DeviceStatusRuntimeInfo(DEVICE_ST_SUBJ_USB, RUNTIME_INFO_KEY_USB_CONNECTED) -{ -} - -DeviceStatusUsb::~DeviceStatusUsb() -{ -} - -bool DeviceStatusUsb::isSupported() -{ - return getSystemInfoBool("tizen.org/feature/usb.host"); -} - -void DeviceStatusUsb::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, - "{" TRIG_BOOL_ITEM_DEF("IsConnected") "}", NULL); -} - -void DeviceStatusUsb::handleUpdate() -{ - bool status = false; - - int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_USB_CONNECTED, &status); - IF_FAIL_VOID_TAG(ret == RUNTIME_INFO_ERROR_NONE, _E, "Getting runtime info failed"); - - Json dataRead; - dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, status ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - - publish(NULL, ERR_NONE, dataRead); -} - -int DeviceStatusUsb::read() -{ - bool status = false; - Json dataRead; - - int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_USB_CONNECTED, &status); - IF_FAIL_RETURN_TAG(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting runtime info failed"); - - dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, status ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); - - replyToRead(NULL, ERR_NONE, dataRead); - return ERR_NONE; -} diff --git a/src/device/system/runtime_info/Usb.h b/src/device/system/runtime_info/Usb.h deleted file mode 100644 index fc8678c..0000000 --- a/src/device/system/runtime_info/Usb.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_USB_H_ -#define _DEVICE_SYSTEM_STATUS_USB_H_ - -#include "RuntimeInfoBase.h" - -namespace ctx { - - class DeviceStatusUsb : public DeviceStatusRuntimeInfo { - public: - DeviceStatusUsb(); - ~DeviceStatusUsb(); - - int read(); - - bool isSupported(); - void submitTriggerItem(); - - protected: - void handleUpdate(); - }; -} - -#endif // _DEVICE_SYSTEM_STATUS_USB_H_ diff --git a/src/email/Email.cpp b/src/email/Email.cpp new file mode 100644 index 0000000..fbf5c8d --- /dev/null +++ b/src/email/Email.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "Email.h" + +using namespace ctx; + +SocialStatusEmail::SocialStatusEmail() : + DeviceProviderBase(SOCIAL_ST_SUBJ_EMAIL), + __dbusSignalId(-1), + __dbusWatcher(DBusType::SESSION) +{ +} + +SocialStatusEmail::~SocialStatusEmail() +{ +} + +bool SocialStatusEmail::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/network.telephony"); +} + +void SocialStatusEmail::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE, + "{" + "\"Event\":{\"type\":\"string\",\"values\":[\"Received\",\"Sent\"]}" + "}", + NULL); +} + +void SocialStatusEmail::onSignal(const char* sender, const char* path, const char* iface, const char* name, GVariant* param) +{ + gint subType = 0; + gint gi1 = 0; + const gchar *gc = NULL; + gint gi2 = 0; + gint gi3 = 0; + + g_variant_get(param, "(ii&sii)", &subType, &gi1, &gc, &gi2, &gi3); + + if (subType == NOTI_DOWNLOAD_FINISH) { + //TODO: Check if this signal actually means that there are new mails + _D("sub type: %d, gi1: %d, gc: %s, gi2: %d, gi3: %d", subType, gi1, gc, gi2, gi3); + Json dataUpdated; + dataUpdated.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_RECEIVED); + publish(NULL, ERR_NONE, dataUpdated); + + } else if (subType == NOTI_SEND_FINISH) { + _D("sub type: %d, gi1: %d, gc: %s, gi2: %d, gi3: %d", subType, gi1, gc, gi2, gi3); + Json dataUpdated; + dataUpdated.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_SENT); + publish(NULL, ERR_NONE, dataUpdated); + } +} + + +int SocialStatusEmail::subscribe() +{ + __dbusSignalId = __dbusWatcher.watch(NULL, NULL, "User.Email.NetworkStatus", "email", this); + IF_FAIL_RETURN_TAG(__dbusSignalId >= 0, ERR_OPERATION_FAILED, _E, "Email dbus signal subscription failed"); + return ERR_NONE; +} + + +int SocialStatusEmail::unsubscribe() +{ + __dbusWatcher.unwatch(__dbusSignalId); + return ERR_NONE; +} diff --git a/src/email/Email.h b/src/email/Email.h new file mode 100644 index 0000000..b78eb33 --- /dev/null +++ b/src/email/Email.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_EMAIL_H_ +#define _CONTEXT_SOCIAL_STATUS_EMAIL_H_ + +#include +#include "../shared/SocialTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class SocialStatusEmail : public DeviceProviderBase, public IDBusSignalListener { + public: + SocialStatusEmail(); + ~SocialStatusEmail(); + + int subscribe(); + int unsubscribe(); + + bool isSupported(); + void submitTriggerItem(); + + void onSignal(const char *sender, const char *path, const char *iface, const char *name, GVariant *param); + + private: + int64_t __dbusSignalId; + DBusSignalWatcher __dbusWatcher; + }; +} + +#endif // _CONTEXT_SOCIAL_STATUS_EMAIL_H_ diff --git a/src/geofence/GeofenceMonitorHandle.cpp b/src/geofence/GeofenceMonitorHandle.cpp new file mode 100644 index 0000000..868966a --- /dev/null +++ b/src/geofence/GeofenceMonitorHandle.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "PlaceGeofenceProvider.h" +#include "GeofenceMonitorHandle.h" + +using namespace ctx; + +GeofenceMonitorHandle::GeofenceMonitorHandle(PlaceGeofenceProvider *provider) : + __provider(provider), + __placeId(-1), + __prevState(GEOFENCE_STATE_UNCERTAIN), + __geoHandle(NULL) +{ +} + +GeofenceMonitorHandle::~GeofenceMonitorHandle() +{ + __stopMonitor(); +} + +bool GeofenceMonitorHandle::startMonitor(int placeId) +{ + _D("Starts to monitor Place-%d", placeId); + + IF_FAIL_RETURN(placeId >= 0, false); + IF_FAIL_RETURN_TAG(__geoHandle == NULL, false, _E, "Re-starting MyPlace monitor"); + + geofence_manager_create(&__geoHandle); + IF_FAIL_RETURN_TAG(__geoHandle, false, _E, "Geofence initialization failed"); + + int ret; + + ret = geofence_manager_set_geofence_state_changed_cb(__geoHandle, __fenceStateCb, this); + IF_FAIL_CATCH_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, _E, "Setting state callback failed"); + + ret = geofence_manager_set_geofence_event_cb(__geoHandle, __fenceEventCb, this); + IF_FAIL_CATCH_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, _E, "Setting event callback failed"); + + ret = geofence_manager_foreach_place_geofence_list(__geoHandle, placeId, __fenceListCb, this); + IF_FAIL_CATCH_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, _E, "Getting fence list failed"); + + __placeId = placeId; + return true; + +CATCH: + __stopMonitor(); + return false; +} + +int GeofenceMonitorHandle::getPlaceId() +{ + return __placeId; +} + +void GeofenceMonitorHandle::__stopMonitor() +{ + _D("Stops monitoring Place-%d", __placeId); + + //TODO: Do we need to stop all geofences explicitly? + if (__geoHandle) { + geofence_manager_destroy(__geoHandle); + __geoHandle = NULL; + } + + __geoStateMap.clear(); + __placeId = -1; + __prevState = GEOFENCE_STATE_UNCERTAIN; +} + +bool GeofenceMonitorHandle::__startFence(int fenceId) +{ + int ret; + + ret = geofence_manager_start(__geoHandle, fenceId); + IF_FAIL_RETURN_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, true, _W, "Starting failed"); + + geofence_status_h status; + ret = geofence_status_create(fenceId, &status); + IF_FAIL_RETURN_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, true, _W, "Getting status failed"); + + geofence_state_e state = GEOFENCE_STATE_UNCERTAIN; + geofence_status_get_state(status, &state); + geofence_status_destroy(status); + + __geoStateMap[fenceId] = state; + + return true; +} + +void GeofenceMonitorHandle::__removeFence(int fenceId) +{ + geofence_manager_stop(__geoHandle, fenceId); + __geoStateMap.erase(fenceId); +} + +void GeofenceMonitorHandle::__updateFence(int fenceId, geofence_manage_e manage) +{ + switch (manage) { + case GEOFENCE_MANAGE_PLACE_REMOVED: + _W("[Place-%d] Removed", __placeId); + __stopMonitor(); + break; + case GEOFENCE_MANAGE_FENCE_ADDED: + _I("[Place %d] Fence-%d added", __placeId, fenceId); + __startFence(fenceId); + __emitStateChange(); + break; + case GEOFENCE_MANAGE_FENCE_REMOVED: + _I("[Place-%d] Fence-%d removed", __placeId, fenceId); + __removeFence(fenceId); + __emitStateChange(); + break; + case GEOFENCE_MANAGE_FENCE_STARTED: + _D("[Place-%d] Fence-%d started", __placeId, fenceId); + break; + case GEOFENCE_MANAGE_FENCE_STOPPED: + _D("[Place-%d] Fence-%d stopped", __placeId, fenceId); + //TODO: Do we need to restart this? + break; + default: + _D("[Place-%d] Ignoring the manage event %d", __placeId, manage); + break; + } +} + +void GeofenceMonitorHandle::__updateState(int fenceId, geofence_state_e state) +{ + __geoStateMap[fenceId] = state; +} + +void GeofenceMonitorHandle::__emitStateChange() +{ + geofence_state_e currentState = GEOFENCE_STATE_UNCERTAIN; + int outCount = 0; + + for (auto it = __geoStateMap.begin(); it != __geoStateMap.end(); ++it) { + if (it->second == GEOFENCE_STATE_IN) { + currentState = GEOFENCE_STATE_IN; + break; + } else if (it->second == GEOFENCE_STATE_OUT) { + ++outCount; + } + } + + if (currentState != GEOFENCE_STATE_IN && outCount > 0) { + currentState = GEOFENCE_STATE_OUT; + } + + if (currentState == __prevState) { + return; + } + + __prevState = currentState; + + Json option; + option.set(NULL, PLACE_GEOFENCE_PLACE_ID, __placeId); + + Json data; + data.set(NULL, PLACE_GEOFENCE_PLACE_ID, __placeId); + data.set(NULL, PLACE_GEOFENCE_EVENT, __getStateString(currentState)); + + __provider->publish(option, ERR_NONE, data); +} + +const char* GeofenceMonitorHandle::__getStateString(geofence_state_e state) +{ + switch (state) { + case GEOFENCE_STATE_IN: + return PLACE_GEOFENCE_IN; + case GEOFENCE_STATE_OUT: + return PLACE_GEOFENCE_OUT; + case GEOFENCE_STATE_UNCERTAIN: + return PLACE_GEOFENCE_UNCERTAIN; + default: + return PLACE_GEOFENCE_UNCERTAIN; + } +} + +bool GeofenceMonitorHandle::__fenceListCb(int geofenceId, geofence_h fence, int fenceIndex, int fenceCount, void* userData) +{ + _D("FenceID: %d, Index: %d, Count: %d", geofenceId, fenceIndex, fenceCount); + IF_FAIL_RETURN(fenceCount > 0, false); + + GeofenceMonitorHandle *handle = reinterpret_cast(userData); + return handle->__startFence(geofenceId); +} + +void GeofenceMonitorHandle::__fenceEventCb(int placeId, int geofenceId, geofence_manager_error_e error, geofence_manage_e manage, void* userData) +{ + IF_FAIL_VOID_TAG(error == GEOFENCE_MANAGER_ERROR_NONE, _W, "Geofence error: %d", error); + + GeofenceMonitorHandle *handle = reinterpret_cast(userData); + + IF_FAIL_VOID_TAG(placeId == handle->getPlaceId(), _W, "Mismatched Place ID"); + + handle->__updateFence(geofenceId, manage); +} + +void GeofenceMonitorHandle::__fenceStateCb(int geofenceId, geofence_state_e state, void* userData) +{ + GeofenceMonitorHandle *handle = reinterpret_cast(userData); + handle->__updateState(geofenceId, state); + handle->__emitStateChange(); +} diff --git a/src/geofence/GeofenceMonitorHandle.h b/src/geofence/GeofenceMonitorHandle.h new file mode 100644 index 0000000..6bdd301 --- /dev/null +++ b/src/geofence/GeofenceMonitorHandle.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_GEOFENCE_MONITOR_HANDLE_H_ +#define _CONTEXT_PLACE_GEOFENCE_MONITOR_HANDLE_H_ + +#include +#include +#include + +namespace ctx { + + class PlaceGeofenceProvider; + + class GeofenceMonitorHandle { + public: + GeofenceMonitorHandle(PlaceGeofenceProvider *provider); + ~GeofenceMonitorHandle(); + + bool startMonitor(int placeId); + int getPlaceId(); + + private: + PlaceGeofenceProvider *__provider; + int __placeId; + geofence_state_e __prevState; + geofence_manager_h __geoHandle; + std::map __geoStateMap; + + void __emitStateChange(); + void __stopMonitor(); + bool __startFence(int fenceId); + void __removeFence(int fenceId); + void __updateFence(int fenceId, geofence_manage_e manage); + void __updateState(int fenceId, geofence_state_e state); + + static const char* __getStateString(geofence_state_e state); + + static bool __fenceListCb(int geofenceId, geofence_h fence, int fenceIndex, int fenceCount, void* userData); + static void __fenceEventCb(int placeId, int geofenceId, geofence_manager_error_e error, geofence_manage_e manage, void* userData); + static void __fenceStateCb(int geofenceId, geofence_state_e state, void* userData); + }; + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_GEOFENCE_MONITOR_HANDLE_H_ */ diff --git a/src/geofence/PlaceGeofenceProvider.cpp b/src/geofence/PlaceGeofenceProvider.cpp new file mode 100644 index 0000000..e7aff50 --- /dev/null +++ b/src/geofence/PlaceGeofenceProvider.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "GeofenceMonitorHandle.h" +#include "PlaceGeofenceProvider.h" + +using namespace ctx; + +PlaceGeofenceProvider::PlaceGeofenceProvider() : + ContextProvider(PLACE_SUBJ_GEOFENCE) +{ +} + +PlaceGeofenceProvider::~PlaceGeofenceProvider() +{ + for (auto& it : __handleMap) { + delete it.second; + } + + __handleMap.clear(); +} + +bool PlaceGeofenceProvider::isSupported() +{ + bool supported = false; + int ret = geofence_manager_is_supported(&supported); + IF_FAIL_RETURN_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, false, _E, "geofence_manager_is_supported() failed"); + return supported; +} + +void PlaceGeofenceProvider::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE, + "{" + "\"Event\":{\"type\":\"string\",\"values\":[\"In\",\"Out\"]}" + "}", + "{" + "\"PlaceId\":{\"type\":\"integer\",\"min\":1}" + "}"); +} + +int PlaceGeofenceProvider::subscribe(Json option, Json *requestResult) +{ + int placeId = -1; + option.get(NULL, PLACE_GEOFENCE_PLACE_ID, &placeId); + IF_FAIL_RETURN_TAG(placeId != -1, ERR_INVALID_PARAMETER, _E, "Getting PlaceID failed"); + + auto it = __handleMap.find(placeId); + if (it != __handleMap.end()) { + _D("Place ID %d is being monitored already", placeId); + return ERR_NONE; + } + + GeofenceMonitorHandle *handle = new(std::nothrow) GeofenceMonitorHandle(this); + ASSERT_ALLOC(handle); + + bool ret = handle->startMonitor(placeId); + if (!ret) { + _E("Monitoring Place ID %d failed", placeId); + delete handle; + return ERR_OPERATION_FAILED; + } + + __handleMap[placeId] = handle; + + return ERR_NONE; +} + +int PlaceGeofenceProvider::unsubscribe(Json option) +{ + int placeId = -1; + option.get(NULL, PLACE_GEOFENCE_PLACE_ID, &placeId); + IF_FAIL_RETURN_TAG(placeId != -1, ERR_INVALID_PARAMETER, _E, "Getting PlaceID failed"); + + auto it = __handleMap.find(placeId); + if (it == __handleMap.end()) { + _D("Place ID %d is not being monitored", placeId); + return ERR_NONE; + } + + delete it->second; + __handleMap.erase(it); + + return ERR_NONE; +} diff --git a/src/geofence/PlaceGeofenceProvider.h b/src/geofence/PlaceGeofenceProvider.h new file mode 100644 index 0000000..e6ebf2f --- /dev/null +++ b/src/geofence/PlaceGeofenceProvider.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_GEOFENCE_PROVIDER_H_ +#define _CONTEXT_PLACE_GEOFENCE_PROVIDER_H_ + +#include +#include +#include "PlaceGeofenceTypes.h" + +namespace ctx { + + class GeofenceMonitorHandle; + + class PlaceGeofenceProvider : public ContextProvider { + public: + PlaceGeofenceProvider(); + ~PlaceGeofenceProvider(); + + int subscribe(Json option, Json *requestResult); + int unsubscribe(Json option); + + bool isSupported(); + void submitTriggerItem(); + + private: + std::map __handleMap; + }; + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_GEOFENCE_PROVIDER_H_ */ diff --git a/src/geofence/PlaceGeofenceTypes.h b/src/geofence/PlaceGeofenceTypes.h new file mode 100644 index 0000000..fa66a41 --- /dev/null +++ b/src/geofence/PlaceGeofenceTypes.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_GEOFENCE_TYPES_H_ +#define _CONTEXT_PLACE_GEOFENCE_TYPES_H_ + +// Subject +#define PLACE_SUBJ_GEOFENCE "place/geofence" + +// Privilege +#define PLACE_PRIV_GEOFENCE "location" + +// Option & Data Key +#define PLACE_GEOFENCE_PLACE_ID "PlaceId" +#define PLACE_GEOFENCE_EVENT "Event" + +// Data Value +#define PLACE_GEOFENCE_UNCERTAIN "Uncertain" +#define PLACE_GEOFENCE_IN "In" +#define PLACE_GEOFENCE_OUT "Out" + +#endif /* End of _CONTEXT_PLACE_GEOFENCE_TYPES_H_ */ diff --git a/src/headphone/Headphone.cpp b/src/headphone/Headphone.cpp new file mode 100644 index 0000000..3ee6dfa --- /dev/null +++ b/src/headphone/Headphone.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Headphone.h" + +#define HANDLING_DELAY 2000 +#define MAX_HANDLING_COUNT 3 + +using namespace ctx; + +DeviceStatusHeadphone::DeviceStatusHeadphone() : + DeviceProviderBase(DEVICE_ST_SUBJ_HEADPHONE), + __connected(false), + __audioJackState(RUNTIME_INFO_AUDIO_JACK_STATUS_UNCONNECTED), + __btAudioState(false), + __btAudioCallbackOn(false), + __btEventHandlerAdded(false), + __btEventHandlingCount(0) +{ +} + +DeviceStatusHeadphone::~DeviceStatusHeadphone() +{ +} + +bool DeviceStatusHeadphone::isSupported() +{ + return true; +} + +void DeviceStatusHeadphone::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" + TRIG_BOOL_ITEM_DEF("IsConnected") "," + "\"Type\":{\"type\":\"string\",\"values\":[\"Normal\",\"Headset\",\"Bluetooth\"]}" + "}", + NULL); +} + +int DeviceStatusHeadphone::subscribe() +{ + __connected = __getCurrentStatus(); + + // Wired headphone + int ret = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, __onAudioJackStateChanged, this); + IF_FAIL_RETURN(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED); + + // Bluetooth headphone + __setBtAudioCallback(); + + return ERR_NONE; +} + +int DeviceStatusHeadphone::unsubscribe() +{ + runtime_info_unset_changed_cb(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS); + __unsetBtAudioCallback(); + + return ERR_NONE; +} + +int DeviceStatusHeadphone::read() +{ + if (!__beingSubscribed) + __connected = __getCurrentStatus(); + + Json data; + __generateDataPacket(&data); + replyToRead(NULL, ERR_NONE, data); + + return ERR_NONE; +} + +void DeviceStatusHeadphone::__setBtAudioCallback() +{ + IF_FAIL_VOID(!__btAudioCallbackOn); + int ret; + + ret = bt_initialize(); + if (ret != BT_ERROR_NONE) { + _W("Bluetooth initialization failed"); + return; + } + + ret = bt_device_set_connection_state_changed_cb(__onBtConnectionChanged, this); + if (ret != BT_ERROR_NONE) { + bt_deinitialize(); + return; + } + + __btAudioCallbackOn = true; +} + +void DeviceStatusHeadphone::__unsetBtAudioCallback() +{ + IF_FAIL_VOID(__btAudioCallbackOn); + + bt_device_unset_connection_state_changed_cb(); + bt_deinitialize(); + + __btAudioCallbackOn = false; +} + +void DeviceStatusHeadphone::__setBtAudioState(bool state) +{ + __btAudioState = state; +} + +bool DeviceStatusHeadphone::__getCurrentStatus() +{ + int ret; + + // Wired audio + ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, &__audioJackState); + IF_FAIL_RETURN(ret == ERR_NONE, __connected); + + // Bluetooth audio + __btAudioState = false; + ret = bt_initialize(); + if (ret == BT_ERROR_NONE) { + bt_adapter_foreach_bonded_device(__onBtBond, this); + bt_deinitialize(); + } + + return ((__audioJackState != RUNTIME_INFO_AUDIO_JACK_STATUS_UNCONNECTED) || __btAudioState); +} + +void DeviceStatusHeadphone::__generateDataPacket(Json* data) +{ + data->set(NULL, DEVICE_ST_IS_CONNECTED, __connected ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + + switch (__audioJackState) { + case RUNTIME_INFO_AUDIO_JACK_STATUS_CONNECTED_3WIRE: + data->set(NULL, DEVICE_ST_TYPE, DEVICE_ST_NORMAL); + break; + case RUNTIME_INFO_AUDIO_JACK_STATUS_CONNECTED_4WIRE: + data->set(NULL, DEVICE_ST_TYPE, DEVICE_ST_HEADSET); + break; + default: + if (__btAudioState) + data->set(NULL, DEVICE_ST_TYPE, DEVICE_ST_BLUETOOTH); + break; + } +} + +bool DeviceStatusHeadphone::__handleUpdate() +{ + bool prevState = __connected; + __connected = ((__audioJackState != RUNTIME_INFO_AUDIO_JACK_STATUS_UNCONNECTED) || __btAudioState); + + IF_FAIL_RETURN(prevState != __connected, false); + + Json data; + __generateDataPacket(&data); + publish(NULL, ERR_NONE, data); + return true; +} + +void DeviceStatusHeadphone::__handleAudioJackEvent() +{ + int ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, &__audioJackState); + IF_FAIL_VOID_TAG(ret == ERR_NONE, _E, "Getting runtime info failed"); + __handleUpdate(); +} + +void DeviceStatusHeadphone::__onAudioJackStateChanged(runtime_info_key_e runtimeKey, void* userData) +{ + _D("EarJack"); + DeviceStatusHeadphone *instance = static_cast(userData); + instance->__handleAudioJackEvent(); +} + +void DeviceStatusHeadphone::__onBtConnectionChanged(bool connected, bt_device_connection_info_s *connInfo, void *userData) +{ + DeviceStatusHeadphone *instance = static_cast(userData); + IF_FAIL_VOID(connected != instance->__btAudioState); + IF_FAIL_VOID(!instance->__btEventHandlerAdded); + + if (connected) { + _D("BT state checking scheduled"); + instance->__btEventHandlerAdded = true; + instance->__btEventHandlingCount = 0; + g_timeout_add(HANDLING_DELAY, __handleBtEvent, userData); + } else { + __handleBtEvent(userData); + } +} + +gboolean DeviceStatusHeadphone::__handleBtEvent(gpointer data) +{ + _D("BT state checking started"); + DeviceStatusHeadphone *instance = static_cast(data); + instance->__btEventHandlerAdded = false; + + instance->__setBtAudioState(false); + int err = bt_adapter_foreach_bonded_device(__onBtBond, data); + IF_FAIL_RETURN_TAG(err == BT_ERROR_NONE, FALSE, _E, "bt_adapter_foreach_bonded_device() failed"); + + instance->__btEventHandlingCount++; + + if (instance->__handleUpdate() || instance->__btEventHandlingCount >= MAX_HANDLING_COUNT) + return FALSE; + + return TRUE; +} + +bool DeviceStatusHeadphone::__onBtBond(bt_device_info_s *deviceInfo, void* userData) +{ + if (deviceInfo->bt_class.major_device_class != BT_MAJOR_DEVICE_CLASS_AUDIO_VIDEO) + return true; + + bool st = false; + int err = bt_device_is_profile_connected(deviceInfo->remote_address, BT_PROFILE_A2DP, &st); + IF_FAIL_RETURN_TAG(err == BT_ERROR_NONE, false, _E, "bt_device_is_profile_connected() failed"); + + if (st) { + DeviceStatusHeadphone *instance = static_cast(userData); + instance->__setBtAudioState(true); + return false; + } + + return true; +} diff --git a/src/headphone/Headphone.h b/src/headphone/Headphone.h new file mode 100644 index 0000000..2fdd780 --- /dev/null +++ b/src/headphone/Headphone.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_HEADPHONE_H_ +#define _CONTEXT_HEADPNOHE_H_ + +#include +#include +#include +#include "../shared/SystemTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class DeviceStatusHeadphone : public DeviceProviderBase { + public: + DeviceStatusHeadphone(); + ~DeviceStatusHeadphone(); + + int subscribe(); + int unsubscribe(); + int read(); + + bool isSupported(); + void submitTriggerItem(); + + private: + bool __connected; + int __audioJackState; + bool __btAudioState; + bool __btAudioCallbackOn; + bool __btEventHandlerAdded; + int __btEventHandlingCount; + + bool __getCurrentStatus(); + void __setBtAudioCallback(); + void __unsetBtAudioCallback(); + void __setBtAudioState(bool state); + + void __generateDataPacket(Json* data); + bool __handleUpdate(); + void __handleAudioJackEvent(); + static gboolean __handleBtEvent(gpointer data); + + static void __onAudioJackStateChanged(runtime_info_key_e runtimeKey, void* userData); + static void __onBtConnectionChanged(bool connected, bt_device_connection_info_s *connInfo, void *userData); + static bool __onBtBond(bt_device_info_s *deviceInfo, void* userData); + }; +} + +#endif // _CONTEXT_HEADPHONE_H_ diff --git a/src/media-stats/DbHandle.cpp b/src/media-stats/DbHandle.cpp new file mode 100644 index 0000000..e8f0f03 --- /dev/null +++ b/src/media-stats/DbHandle.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "../shared/SystemInfo.h" +#include "MediaStatisticsTypes.h" +#include "DbHandle.h" + +using namespace ctx; + +MediaDbHandle::MediaDbHandle(ContextProvider *provider) : + StatsDbHandleBase(provider) +{ +} + +MediaDbHandle::~MediaDbHandle() +{ +} + +int MediaDbHandle::read(Json filter) +{ + //TODO: filter validation (in the API side?) + std::string query; + const char *subject = reqProvider->getSubject(); + + if (STR_EQ(subject, MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC)) { + query = createSqlPeakTime(MEDIA_TYPE_MUSIC, filter); + + } else if (STR_EQ(subject, MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO)) { + query = createSqlPeakTime(MEDIA_TYPE_VIDEO, filter); + + } else if (STR_EQ(subject, MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC)) { + query = createSqlCommonSetting(MEDIA_TYPE_MUSIC, filter); + + } else if (STR_EQ(subject, MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO)) { + query = createSqlCommonSetting(MEDIA_TYPE_VIDEO, filter); + + } else if (STR_EQ(subject, MEDIA_SUBJ_MUSIC_FREQUENCY)) { + isTriggerItem = true; + query = createSqlFrequency(MEDIA_TYPE_MUSIC, filter); + + } else if (STR_EQ(subject, MEDIA_SUBJ_VIDEO_FREQUENCY)) { + isTriggerItem = true; + query = createSqlFrequency(MEDIA_TYPE_VIDEO, filter); + } + + IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); + + bool ret = executeQuery(filter, query.c_str()); + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + + return ERR_NONE; +} + +std::string MediaDbHandle::createWhereClause(int mediaType, Json filter) +{ + std::stringstream whereClause; + + whereClause << CX_MEDIA_TYPE " = " << mediaType << " AND "; + whereClause << StatsDbHandleBase::createWhereClause(filter); + + return whereClause.str(); +} + +std::string MediaDbHandle::createSqlPeakTime(int mediaType, Json filter) +{ + std::string where = createWhereClause(mediaType, filter); + return StatsDbHandleBase::createSqlPeakTime(filter, MEDIA_TABLE_NAME, where); +} + +std::string MediaDbHandle::createSqlCommonSetting(int mediaType, Json filter) +{ + std::string where = createWhereClause(mediaType, filter); + return StatsDbHandleBase::createSqlCommonSetting(filter, MEDIA_TABLE_NAME, where); +} + +std::string MediaDbHandle::createSqlFrequency(int mediaType, Json filter) +{ + Json filterCleaned; + std::string weekStr; + std::string timeOfDay; + + if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) + filterCleaned.set(NULL, STATS_DAY_OF_WEEK, weekStr); + + if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) + filterCleaned.set(NULL, STATS_TIME_OF_DAY, timeOfDay); + + std::string whereClause = createWhereClause(mediaType, filterCleaned); + + std::stringstream query; + query << + "SELECT IFNULL(COUNT(*),0) AS " STATS_TOTAL_COUNT \ + " FROM " MEDIA_TABLE_NAME \ + " WHERE " << whereClause; + + return query.str(); +} + +void MediaDbHandle::replyTriggerItem(int error, Json &jsonResult) +{ + IF_FAIL_VOID_TAG(STR_EQ(reqProvider->getSubject(), MEDIA_SUBJ_MUSIC_FREQUENCY) || + STR_EQ(reqProvider->getSubject(), MEDIA_SUBJ_VIDEO_FREQUENCY), _E, "Invalid subject"); + + Json results; + int val; + + jsonResult.get(NULL, STATS_TOTAL_COUNT, &val); + results.set(NULL, STATS_TOTAL_COUNT, val); + + reqProvider->replyToRead(reqFilter, error, results); +} diff --git a/src/media-stats/DbHandle.h b/src/media-stats/DbHandle.h new file mode 100644 index 0000000..8b7f1c1 --- /dev/null +++ b/src/media-stats/DbHandle.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_MEDIA_DB_HANDLE_H_ +#define _CONTEXT_STATS_MEDIA_DB_HANDLE_H_ + +#include +#include +#include "../shared/DbHandleBase.h" + +namespace ctx { + class MediaDbHandle : public StatsDbHandleBase { + public: + MediaDbHandle(ContextProvider *provider); + ~MediaDbHandle(); + + int read(Json filter); + + protected: + std::string createWhereClause(int mediaType, Json filter); + std::string createSqlPeakTime(int mediaType, Json filter); + std::string createSqlCommonSetting(int mediaType, Json filter); + std::string createSqlFrequency(int mediaType, Json filter); + void replyTriggerItem(int error, Json &jsonResult); + }; +} + +#endif /* End of _CONTEXT_STATS_MEDIA_DB_HANDLE_H_ */ diff --git a/src/media-stats/MediaContentMonitor.cpp b/src/media-stats/MediaContentMonitor.cpp new file mode 100644 index 0000000..78ff0ef --- /dev/null +++ b/src/media-stats/MediaContentMonitor.cpp @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "../shared/SystemInfo.h" +#include "MediaStatisticsTypes.h" +#include "DbHandle.h" +#include "MediaContentMonitor.h" + +#define PLAYCOUNT_RETENTION_PERIOD 259200 /* 1 month in secs */ +#define ONE_DAY_IN_SEC 86400 + +ctx::MediaContentMonitor::MediaContentMonitor() : + __started(false), + __lastCleanupTime(0) +{ + __dbManager.createTable(0, MEDIA_TABLE_NAME, MEDIA_TABLE_COLUMNS, NULL, NULL); + __dbManager.execute(0, MEDIA_PLAYCOUNT_TABLE_SCHEMA, NULL); + + __started = __startMonitoring(); +} + +ctx::MediaContentMonitor::~MediaContentMonitor() +{ + if (__started) + __stopMonitoring(); +} + +bool ctx::MediaContentMonitor::__startMonitoring() +{ + int err; + err = media_content_connect(); + IF_FAIL_RETURN_TAG(err == MEDIA_CONTENT_ERROR_NONE, false, _E, "media_content_connect() failed"); + + err = media_content_set_db_updated_cb(__onMediaContentDbUpdated, this); + if (err != MEDIA_CONTENT_ERROR_NONE) { + media_content_disconnect(); + _E("media_content_set_db_updated_cb() failed"); + return false; + } + + return true; +} + +void ctx::MediaContentMonitor::__stopMonitoring() +{ + media_content_unset_db_updated_cb(); + media_content_disconnect(); +} + +void ctx::MediaContentMonitor::__onMediaContentDbUpdated( + media_content_error_e error, int pid, + media_content_db_update_item_type_e updateItem, + media_content_db_update_type_e updateType, + media_content_type_e mediaType, + char *uuid, char *path, char *mimeType, void *userData) +{ + IF_FAIL_VOID(error == MEDIA_CONTENT_ERROR_NONE && uuid != NULL); + IF_FAIL_VOID(updateItem == MEDIA_ITEM_FILE && updateType == MEDIA_CONTENT_UPDATE); + IF_FAIL_VOID(mediaType == MEDIA_CONTENT_TYPE_MUSIC || mediaType == MEDIA_CONTENT_TYPE_VIDEO); + + media_info_h media = NULL; + media_info_get_media_from_db(uuid, &media); + IF_FAIL_VOID_TAG(media, _E, "media_info_get_media_from_db() failed"); + + int cnt = -1; + media_info_get_played_count(media, &cnt); + media_info_destroy(media); + IF_FAIL_VOID_TAG(cnt >= 0, _E, "Invalid play count"); + + MediaContentMonitor *instance = static_cast(userData); + instance->__updatePlayCount(uuid, + (mediaType == MEDIA_CONTENT_TYPE_MUSIC) ? MEDIA_TYPE_MUSIC : MEDIA_TYPE_VIDEO, + cnt); +} + +void ctx::MediaContentMonitor::__appendCleanupQuery(std::stringstream &query) +{ + int timestamp = static_cast(time(NULL)); + IF_FAIL_VOID(timestamp - __lastCleanupTime >= ONE_DAY_IN_SEC); + + __lastCleanupTime = timestamp; + + query << + "DELETE FROM Log_MediaPlayCount WHERE UTC < strftime('%s', 'now') - " << PLAYCOUNT_RETENTION_PERIOD << ";" \ + "DELETE FROM " MEDIA_TABLE_NAME " WHERE UTC < strftime('%s', 'now') - " << LOG_RETENTION_PERIOD << ";"; +} + +void ctx::MediaContentMonitor::__updatePlayCount(const char *uuid, int type, int count) +{ + std::stringstream query; + query << + /* Inserting the media record to the play count table, if not exist */ + "INSERT OR IGNORE INTO Log_MediaPlayCount" \ + " (UUID, MediaType) VALUES ('" << uuid << "'," << type <<");" \ + /* Updating the play count and getting the diff from the previous count */ + "UPDATE Log_MediaPlayCount SET Diff = " << count << " - Count," \ + " Count = " << count << ", UTC = strftime('%s', 'now')" \ + " WHERE UUID = '" << uuid << "';"; + __appendCleanupQuery(query); + query << + /* Checking whether the play count changes */ + "SELECT MediaType FROM Log_MediaPlayCount" \ + " WHERE UUID = '" << uuid << "' AND Diff > 0;"; + + __dbManager.execute(0, query.str().c_str(), this); +} + +void ctx::MediaContentMonitor::onExecuted(unsigned int queryId, int error, std::vector& records) +{ + IF_FAIL_VOID(!records.empty()); + + int mediaType = 0; + records[0].get(NULL, CX_MEDIA_TYPE, &mediaType); + + __insertLog(mediaType); +} + +void ctx::MediaContentMonitor::__insertLog(int mediaType) +{ + int systemVolume = -1, mediaVolume = -1, audioJack = -1; + + Json data; + data.set(NULL, CX_MEDIA_TYPE, mediaType); + + if (ctx::system_info::getAudioJackState(&audioJack)) + data.set(NULL, STATS_AUDIO_JACK, audioJack); + + if (ctx::system_info::getVolume(&systemVolume, &mediaVolume)) { + data.set(NULL, STATS_SYSTEM_VOLUME, systemVolume); + data.set(NULL, STATS_MEDIA_VOLUME, mediaVolume); + } + + __dbManager.insert(0, MEDIA_TABLE_NAME, data, NULL); +} diff --git a/src/media-stats/MediaContentMonitor.h b/src/media-stats/MediaContentMonitor.h new file mode 100644 index 0000000..b8709aa --- /dev/null +++ b/src/media-stats/MediaContentMonitor.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_MEDIA_CONTENT_MONITOR_H_ +#define _CONTEXT_STATS_MEDIA_CONTENT_MONITOR_H_ + +#include +#include +#include + +namespace ctx { + + class MediaContentMonitor : public IDatabaseListener { + private: + bool __started; + int __lastCleanupTime; + DatabaseManager __dbManager; + + bool __startMonitoring(); + void __stopMonitoring(); + + void __appendCleanupQuery(std::stringstream &query); + void __updatePlayCount(const char *uuid, int type, int count); + void __insertLog(int mediaType); + + void onTableCreated(unsigned int queryId, int error) {} + void onInserted(unsigned int queryId, int error, int64_t rowId) {} + void onExecuted(unsigned int queryId, int error, std::vector& records); + + static void __onMediaContentDbUpdated(media_content_error_e error, int pid, + media_content_db_update_item_type_e updateItem, + media_content_db_update_type_e updateType, + media_content_type_e mediaType, + char *uuid, char *path, char *mimeType, void *userData); + + public: + MediaContentMonitor(); + ~MediaContentMonitor(); + }; + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_STATS_MEDIA_CONTENT_MONITOR_H_ */ diff --git a/src/media-stats/MediaStatisticsTypes.h b/src/media-stats/MediaStatisticsTypes.h new file mode 100644 index 0000000..a71e553 --- /dev/null +++ b/src/media-stats/MediaStatisticsTypes.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_MEDIA_TYPES_H_ +#define _CONTEXT_STATS_MEDIA_TYPES_H_ + +#include "../shared/CommonTypes.h" + +#define MEDIA_HISTORY_PRIV "mediahistory.read" +#define MEDIA_SUBJ_LOGGER "stats/media/logger" +#define MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC "stats/music/peak_time" +#define MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO "stats/video/peak_time" +#define MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC "stats/music/setting" +#define MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO "stats/video/setting" +#define MEDIA_SUBJ_MUSIC_FREQUENCY "stats/music/frequency" +#define MEDIA_SUBJ_VIDEO_FREQUENCY "stats/video/frequency" + +#define MEDIA_TABLE_NAME "Log_MediaPlayback" +#define MEDIA_TABLE_COLUMNS \ + "MediaType INTEGER NOT NULL, " \ + "SystemVolume INTEGER, MediaVolume INTEGER, AudioJack INTEGER, " \ + "UTC TIMESTAMP DEFAULT (strftime('%s', 'now')), " \ + "LocalTime TIMESTAMP DEFAULT (strftime('%s', 'now', 'localtime'))" + +#define MEDIA_PLAYCOUNT_TABLE_SCHEMA \ + "CREATE TABLE IF NOT EXISTS Log_MediaPlayCount" \ + " (UUID TEXT NOT NULL PRIMARY KEY, MediaType INTEGER NOT NULL," \ + " Count INTEGER DEFAULT 0, Diff INTEGER DEFAULT 0, " \ + " UTC TIMESTAMP DEFAULT (strftime('%s', 'now')))" + +#define CX_MEDIA_TYPE "MediaType" + +enum mediaType_e { + MEDIA_TYPE_MUSIC = 1, + MEDIA_TYPE_VIDEO, +}; + +#endif /* End of _CONTEXT_STATS_MEDIA_TYPES_H_ */ diff --git a/src/media-stats/MediaStatsLogger.cpp b/src/media-stats/MediaStatsLogger.cpp new file mode 100644 index 0000000..9b1db7d --- /dev/null +++ b/src/media-stats/MediaStatsLogger.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "MediaStatisticsTypes.h" +#include "MediaStatsLogger.h" + +using namespace ctx; + +MediaStatsLogger::MediaStatsLogger() : + ContextProvider(MEDIA_SUBJ_LOGGER) +{ +} + +MediaStatsLogger::~MediaStatsLogger() +{ +} + +int MediaStatsLogger::subscribe(Json option, Json* requestResult) +{ + return ERR_NONE; +} + +int MediaStatsLogger::unsubscribe(Json option) +{ + return ERR_NONE; +} diff --git a/src/media-stats/MediaStatsLogger.h b/src/media-stats/MediaStatsLogger.h new file mode 100644 index 0000000..28e8aca --- /dev/null +++ b/src/media-stats/MediaStatsLogger.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_MEDIA_STATS_LOGGER_H_ +#define _CONTEXT_MEDIA_STATS_LOGGER_H_ + +#include +#include "MediaContentMonitor.h" + +namespace ctx { + + class MediaStatsLogger : public ContextProvider { + public: + MediaStatsLogger(); + ~MediaStatsLogger(); + + int subscribe(Json option, Json *requestResult); + int unsubscribe(Json option); + + void submitTriggerItem() {} + + private: + MediaContentMonitor __contentMon; + }; + +} /* namespace ctx */ + +#endif /* _CONTEXT_MEDIA_STATS_LOGGER_H_ */ + diff --git a/src/media-stats/MediaStatsProvider.cpp b/src/media-stats/MediaStatsProvider.cpp new file mode 100644 index 0000000..b8ce482 --- /dev/null +++ b/src/media-stats/MediaStatsProvider.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "MediaStatsProvider.h" +#include "DbHandle.h" + +using namespace ctx; + +MediaStatsProvider::MediaStatsProvider(const char *subject) : + ContextProvider(subject) +{ +} + +MediaStatsProvider::~MediaStatsProvider() +{ +} + +bool MediaStatsProvider::isSupported() +{ + /* TODO */ + return true; +} + +void MediaStatsProvider::submitTriggerItem() +{ +} + +int MediaStatsProvider::read(Json option, Json* requestResult) +{ + MediaDbHandle *handle = new(std::nothrow) MediaDbHandle(this); + IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); + + int err = handle->read(option); + if (err != ERR_NONE) { + delete handle; + return err; + } + + return ERR_NONE; +} + +void MusicFreqProvider::submitTriggerItem() +{ + registerTriggerItem(OPS_READ, + "{" TRIG_DEF_TOTAL_COUNT "}", + "{" TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK "}"); +} + +void VideoFreqProvider::submitTriggerItem() +{ + registerTriggerItem(OPS_READ, + "{" TRIG_DEF_TOTAL_COUNT "}", + "{" TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK "}"); +} diff --git a/src/media-stats/MediaStatsProvider.h b/src/media-stats/MediaStatsProvider.h new file mode 100644 index 0000000..5895c46 --- /dev/null +++ b/src/media-stats/MediaStatsProvider.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_MEDIA_STATS_PROVIDER_H_ +#define _CONTEXT_MEDIA_STATS_PROVIDER_H_ + +#include +#include "MediaStatisticsTypes.h" + +namespace ctx { + + class MediaStatsProvider : public ContextProvider { + public: + int read(Json option, Json* requestResult); + + bool isSupported(); + virtual void submitTriggerItem(); + + protected: + MediaStatsProvider(const char *subject); + virtual ~MediaStatsProvider(); + }; /* class MediaStatsProvider */ + + + class MusicPeakTimeProvider : public MediaStatsProvider { + public: + MusicPeakTimeProvider() : + MediaStatsProvider(MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC) {} + }; + + + class VideoPeakTimeProvider : public MediaStatsProvider { + public: + VideoPeakTimeProvider() : + MediaStatsProvider(MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO) {} + }; + + + class MusicSettingProvider: public MediaStatsProvider { + public: + MusicSettingProvider() : + MediaStatsProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC) {} + }; + + + class VideoSettingProvider: public MediaStatsProvider { + public: + VideoSettingProvider() : + MediaStatsProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO) {} + }; + + + class MusicFreqProvider: public MediaStatsProvider { + public: + MusicFreqProvider() : + MediaStatsProvider(MEDIA_SUBJ_MUSIC_FREQUENCY) {} + + void submitTriggerItem(); + }; + + + class VideoFreqProvider: public MediaStatsProvider { + public: + VideoFreqProvider() : + MediaStatsProvider(MEDIA_SUBJ_VIDEO_FREQUENCY) {} + + void submitTriggerItem(); + }; + +} /* namespace ctx */ + +#endif /* _CONTEXT_MEDIA_STATS_PROVIDER_H_ */ diff --git a/src/message/Message.cpp b/src/message/Message.cpp new file mode 100644 index 0000000..9316806 --- /dev/null +++ b/src/message/Message.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Message.h" + +#define MAX_ADDR_SIZE 20 + +using namespace ctx; + +SocialStatusMessage::SocialStatusMessage() : + DeviceProviderBase(SOCIAL_ST_SUBJ_MESSAGE), + __messageHandle(NULL) +{ +} + +SocialStatusMessage::~SocialStatusMessage() +{ +} + +bool SocialStatusMessage::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/network.telephony"); +} + +void SocialStatusMessage::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE, + "{" + "\"Event\":{\"type\":\"string\",\"values\":[\"Received\"]}," + "\"Type\":{\"type\":\"string\",\"values\":[\"SMS\",\"MMS\"]}," + "\"Address\":{\"type\":\"string\"}" + "}", + NULL); +} + +void SocialStatusMessage::__updateCb(msg_handle_t handle, msg_struct_t msg, void* userData) +{ + SocialStatusMessage *instance = static_cast(userData); + instance->__handleUpdate(msg); +} + +void SocialStatusMessage::__handleUpdate(msg_struct_t msg) +{ + int err; + int type; + char address[MAX_ADDR_SIZE]; + Json data; + + err = msg_get_int_value(msg, MSG_MESSAGE_TYPE_INT, &type); + IF_FAIL_VOID_TAG(err == MSG_SUCCESS, _W, "Getting message type failed"); + + err = msg_get_str_value(msg, MSG_MESSAGE_REPLY_ADDR_STR, address, MAX_ADDR_SIZE); + IF_FAIL_VOID_TAG(err == MSG_SUCCESS, _W, "Getting reply address failed"); + + switch (type) { + case MSG_TYPE_SMS_CB : + case MSG_TYPE_SMS_JAVACB : + case MSG_TYPE_SMS_WAPPUSH : + case MSG_TYPE_SMS_MWI : + case MSG_TYPE_SMS_SYNCML : + case MSG_TYPE_SMS_REJECT : + case MSG_TYPE_SMS_ETWS_PRIMARY : + case MSG_TYPE_SMS : + data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_SMS); + break; + case MSG_TYPE_MMS_NOTI : + case MSG_TYPE_MMS_JAVA : + case MSG_TYPE_MMS : + data.set(NULL, SOCIAL_ST_TYPE, SOCIAL_ST_MMS); + break; + default : + _W("Unknown message type"); + return; + } + + data.set(NULL, SOCIAL_ST_EVENT, SOCIAL_ST_RECEIVED); + data.set(NULL, SOCIAL_ST_ADDRESS, address); + + publish(NULL, ERR_NONE, data); +} + +bool SocialStatusMessage::__setCallback() +{ + int err; + + err = msg_open_msg_handle(&__messageHandle); + IF_FAIL_RETURN_TAG(err == MSG_SUCCESS, false, _E, "Handle creation failed"); + + err = msg_reg_sms_message_callback(__messageHandle, __updateCb, 0, this); + if (err != MSG_SUCCESS) { + msg_close_msg_handle(&__messageHandle); + _E("Setting SMS event callback failed"); + return false; + } + + msg_reg_mms_conf_message_callback(__messageHandle, __updateCb, NULL, this); + return true; +} + +void SocialStatusMessage::__unsetCallback() +{ + if (__messageHandle) + msg_close_msg_handle(&__messageHandle); + + __messageHandle = NULL; +} + +int SocialStatusMessage::subscribe() +{ + bool ret = __setCallback(); + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int SocialStatusMessage::unsubscribe() +{ + __unsetCallback(); + return ERR_NONE; +} diff --git a/src/message/Message.h b/src/message/Message.h new file mode 100644 index 0000000..79e489a --- /dev/null +++ b/src/message/Message.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_SMS_H_ +#define _CONTEXT_SOCIAL_STATUS_SMS_H_ + +#include +#include +#include "../shared/SocialTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class SocialStatusMessage : public DeviceProviderBase { + public: + SocialStatusMessage(); + ~SocialStatusMessage(); + + int subscribe(); + int unsubscribe(); + + bool isSupported(); + void submitTriggerItem(); + + private: + msg_handle_t __messageHandle; + bool __beingSubscribed; + + bool __setCallback(); + void __unsetCallback(); + void __handleUpdate(msg_struct_t msg); + static void __updateCb(msg_handle_t handle, msg_struct_t msg, void* userData); + }; +} + +#endif // _CONTEXT_SOCIAL_STATUS_SMS_H_ diff --git a/src/my-place/place_recognition.cpp b/src/my-place/place_recognition.cpp new file mode 100644 index 0000000..b736f1a --- /dev/null +++ b/src/my-place/place_recognition.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "place_recognition.h" +#include "user_places/user_places.h" + +int ctx::PlaceRecognitionProvider::subscribe(ctx::Json option, ctx::Json* requestResult) +{ + return ERR_NOT_SUPPORTED; +} + +int ctx::PlaceRecognitionProvider::unsubscribe(ctx::Json option) +{ + return ERR_NOT_SUPPORTED; +} + +int ctx::PlaceRecognitionProvider::read(ctx::Json option, ctx::Json* requestResult) +{ + _I(BLUE("Read")); + _J("Option", option); + + std::vector> places = __engine.getPlaces(); + Json dataRead = UserPlaces::composeJson(places); + + /* + * The below function needs to be called once. + * It does not need to be called within this read() function. + * In can be called later, in another scope. + * Please just be sure that, the 2nd input parameter "option" should be the same to the + * "option" parameter received via ctx::PlaceRecognitionProvider::read(). + */ + replyToRead(option, ERR_NONE, dataRead); + + return ERR_NONE; +} + +int ctx::PlaceRecognitionProvider::write(ctx::Json data, ctx::Json* requestResult) +{ + return ERR_NOT_SUPPORTED; +} + +bool ctx::PlaceRecognitionProvider::isSupported() +{ + /* TODO: This function should be implemented properly */ + return true; +} diff --git a/src/my-place/place_recognition.h b/src/my-place/place_recognition.h new file mode 100644 index 0000000..814bb00 --- /dev/null +++ b/src/my-place/place_recognition.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_H_ +#define _CONTEXT_PLACE_RECOGNITION_H_ + +#include +#include "place_recognition_types.h" +#include "user_places/user_places.h" + +namespace ctx { + + class PlaceRecognitionProvider : public ContextProvider { + public: + PlaceRecognitionProvider() : + ContextProvider(PLACE_SUBJ_RECOGNITION), + __engine(PLACE_RECOG_HIGH_ACCURACY_MODE) {} + + ~PlaceRecognitionProvider() {} + + int subscribe(ctx::Json option, ctx::Json *requestResult); + int unsubscribe(ctx::Json option); + int read(ctx::Json option, ctx::Json *requestResult); + int write(ctx::Json data, ctx::Json *requestResult); + + bool isSupported(); + void submitTriggerItem() {} + + private: + UserPlaces __engine; + }; /* class PlaceRecognitionProvider */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_H_ */ diff --git a/src/my-place/place_recognition_types.h b/src/my-place/place_recognition_types.h new file mode 100644 index 0000000..9576331 --- /dev/null +++ b/src/my-place/place_recognition_types.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_TYPES_ +#define _CONTEXT_PLACE_RECOGNITION_TYPES_ + +// Context Items +#define PLACE_SUBJ_RECOGNITION "place/pattern/personal_poi" + +#define PLACE_PRIV_RECOGNITION "location" + +// Database +#define VISIT_TABLE "place_status_user_place_visit" +#define VISIT_COLUMN_START_TIME "start_time" +#define VISIT_COLUMN_END_TIME "end_time" +#define VISIT_COLUMN_WIFI_APS "wifi_aps" +#define VISIT_COLUMN_CATEGORY "category" +#ifdef TIZEN_ENGINEER_MODE +#define VISIT_COLUMN_START_TIME_HUMAN "start_time_human" // only for debug: human readable time data: +#define VISIT_COLUMN_END_TIME_HUMAN "end_time_human" // only for debug: human readable time data: +#endif /* TIZEN_ENGINEER_MODE */ +#define VISIT_COLUMN_LOCATION_VALID "geo_valid" +#define VISIT_COLUMN_LOCATION_LATITUDE "geo_latitude" +#define VISIT_COLUMN_LOCATION_LONGITUDE "geo_longitude" +#define VISIT_COLUMN_CATEG_HOME "categ_home" +#define VISIT_COLUMN_CATEG_WORK "categ_work" +#define VISIT_COLUMN_CATEG_OTHER "categ_other" + +#define PLACE_TABLE "place_status_user_place" +#define PLACE_COLUMN_CATEG_ID "type_id" // Name inconsistency: "cated_id" vs "type_id" TODO make it consistent +#define PLACE_COLUMN_CATEG_CONFIDENCE "type_confidence" +#define PLACE_COLUMN_NAME "name" +#define PLACE_COLUMN_LOCATION_VALID "geo_valid" +#define PLACE_COLUMN_LOCATION_LATITUDE "geo_latitude" +#define PLACE_COLUMN_LOCATION_LONGITUDE "geo_longitude" +#define PLACE_COLUMN_WIFI_APS "wifi_aps" +#define PLACE_COLUMN_CREATE_DATE "create_date" + +#define WIFI_TABLE_NAME "place_status_user_place_wifi" +#define WIFI_COLUMN_TIMESTAMP "timestamp" +#define WIFI_COLUMN_BSSID "bssid" + +#define LOCATION_TABLE_NAME "place_status_user_place_location" +#define LOCATION_COLUMN_LATITUDE "geo_latitude" +#define LOCATION_COLUMN_LONGITUDE "geo_longitude" +#define LOCATION_COLUMN_ACCURACY "accuracy" +#define LOCATION_COLUMN_TIMESTAMP "timestamp" +#ifdef TIZEN_ENGINEER_MODE +#define LOCATION_COLUMN_TIMESTAMP_HUMAN "time_human" // only for debug: human readable time data: +#define LOCATION_COLUMN_METHOD "method" +#endif /* TIZEN_ENGINEER_MODE */ + +// Data Key +#define DATA_READ "PlacesList" +#define PLACE_CATEG_ID "TypeId" // Name inconsistency: "cated_id" vs "type_id" TODO make it consistent +#define PLACE_CATEG_CONFIDENCE "TypeConfidence" +#define PLACE_NAME "Name" +#define PLACE_GEO_LATITUDE "GeoLatitude" +#define PLACE_GEO_LONGITUDE "GeoLongitude" +#define PLACE_WIFI_APS "WifiAPs" +#define PLACE_CREATE_DATE "CreateDate" + +// Data values +enum PlaceCategId { + PLACE_CATEG_ID_NONE = 0, + PLACE_CATEG_ID_HOME = 1, + PLACE_CATEG_ID_WORK = 2, + PLACE_CATEG_ID_OTHER = 3 +}; + +enum PlaceRecogMode { + PLACE_RECOG_HIGH_ACCURACY_MODE = 0, + PLACE_RECOG_LOW_POWER_MODE = 1 +}; + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_TYPES_ */ diff --git a/src/my-place/user_places/debug_utils.cpp b/src/my-place/user_places/debug_utils.cpp new file mode 100644 index 0000000..b5fccf2 --- /dev/null +++ b/src/my-place/user_places/debug_utils.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "debug_utils.h" +#include + +std::string ctx::DebugUtils::humanReadableDateTime(time_t timestamp, std::string format, size_t size, bool utc) +{ + struct tm * timeinfo; + if (utc) { + format += " UTC"; + size += 4; + timeinfo = gmtime(×tamp); + } else { + timeinfo = localtime(×tamp); + } + char buffer[size]; + if (timeinfo) { + strftime(buffer, size, format.c_str(), timeinfo); + } else { + snprintf(buffer, size, "NULL"); + } + return std::string(buffer); +} diff --git a/src/my-place/user_places/debug_utils.h b/src/my-place/user_places/debug_utils.h new file mode 100644 index 0000000..dde40bc --- /dev/null +++ b/src/my-place/user_places/debug_utils.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_DEBUG_UTILS_H_ +#define _CONTEXT_PLACE_RECOGNITION_DEBUG_UTILS_H_ + +#include +#include + +namespace ctx { + + class DebugUtils { + + public: + static std::string humanReadableDateTime(time_t timestamp, std::string format, size_t size, bool utc = false); + + }; /* class DebugUtils */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_DEBUG_UTILS_H_ */ diff --git a/src/my-place/user_places/gmap.cpp b/src/my-place/user_places/gmap.cpp new file mode 100644 index 0000000..845b3cf --- /dev/null +++ b/src/my-place/user_places/gmap.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "gmap.h" +#include +#include + +const std::string ctx::Gmap::__HTML_HEADER = R"( + + + + + + Simple markers + + + + + +
+ + +)"; + +std::string ctx::Gmap::__iconForCategId(PlaceCategId categId) +{ + switch (categId) { + case PLACE_CATEG_ID_HOME: return "markerH.png"; + case PLACE_CATEG_ID_WORK: return "markerW.png"; + case PLACE_CATEG_ID_OTHER: return "markerO.png"; + case PLACE_CATEG_ID_NONE: return "markerN.png"; + default: return "markerD.png"; + } +} + +void ctx::Gmap::__placeMarker2Stream(const ctx::Place& place, std::ostream& out) +{ + if (place.locationValid) { + out << "new google.maps.Marker({" << std::endl; + out << " position: new google.maps.LatLng(" << place.location.latitude << "," << place.location.longitude << ")," << std::endl; + out << " map: map," << std::endl; + out << " icon: \"http://maps.google.com/mapfiles/" << __iconForCategId(place.categId)<< "\"" << std::endl; + out << "});" << std::endl; + } +} + +void ctx::Gmap::__html2Stream(const std::vector>& places, std::ostream& out) +{ + out << __HTML_HEADER; + for (std::shared_ptr place : places) { + __placeMarker2Stream(*place, out); + } + out << __HTML_FOOTER; +} + +void ctx::Gmap::writeMap(const std::vector>& places) +{ + std::ofstream out(GMAP_FILE); + __html2Stream(places, out); +} diff --git a/src/my-place/user_places/gmap.h b/src/my-place/user_places/gmap.h new file mode 100644 index 0000000..29eacd2 --- /dev/null +++ b/src/my-place/user_places/gmap.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_GMAP_H_ +#define _CONTEXT_PLACE_RECOGNITION_GMAP_H_ + +#include "user_places_types.h" +#include "../place_recognition_types.h" + +#define GMAP_FILE "/opt/usr/media/Others/user_places_map.html" + +namespace ctx { + + /* + * Class for generating a HTML page with GoogleMaps with all user places. + * This class is for test/demo purposes only. TODO: Remove this class from final solution. + */ + class Gmap { + + private: + static const std::string __HTML_HEADER; + static const std::string __HTML_FOOTER; + static std::string __iconForCategId(PlaceCategId categId); + static void __placeMarker2Stream(const Place& place, std::ostream& out); + static void __html2Stream(const std::vector>& places, std::ostream& out); + + public: + static void writeMap(const std::vector>& places); + + }; /* class Gmap */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_GMAP_H_ */ diff --git a/src/my-place/user_places/graph.cpp b/src/my-place/user_places/graph.cpp new file mode 100644 index 0000000..53daeb3 --- /dev/null +++ b/src/my-place/user_places/graph.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "graph.h" + +std::shared_ptr ctx::graph::connectedComponents(Graph &graph) +{ + std::shared_ptr ccs = std::make_shared(); + std::set fringe; + + for (Node i = 0; i < static_cast(graph.size()); i++) { + if (!graph[i]) { + continue; + } + // neighbourhood of node i exists (was not removed) + std::shared_ptr c = std::make_shared(); + ccs->push_back(c); + fringe.insert(i); + while (!fringe.empty()) { + Node currNode = *fringe.begin(); + fringe.erase(fringe.begin()); + c->insert(currNode); + + std::shared_ptr currNhood = graph[currNode]; + for (Node nhoodNode : *currNhood) { + if (graph[nhoodNode] && fringe.find(nhoodNode) == fringe.end()) { + fringe.insert(nhoodNode); + } + } + graph[currNode].reset(); // removing current node + } + } + return ccs; +} diff --git a/src/my-place/user_places/graph.h b/src/my-place/user_places/graph.h new file mode 100644 index 0000000..9fedb26 --- /dev/null +++ b/src/my-place/user_places/graph.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_GRAPH_H_ +#define _CONTEXT_PLACE_RECOGNITION_GRAPH_H_ + +#include +#include +#include + +namespace ctx { + +namespace graph { + + typedef int Node; + typedef std::set NeighbourNodes; + typedef std::vector> Graph; + typedef std::set Component; + typedef std::vector> Components; + + /* + * make connected components of a given graph + * caution: the graph will be changed (its nodes will be cleared) + */ + std::shared_ptr connectedComponents(Graph &graph); + +} /* namespace graph */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_GRAPH_H_ */ diff --git a/src/my-place/user_places/location_listener_iface.h b/src/my-place/user_places/location_listener_iface.h new file mode 100644 index 0000000..914e022 --- /dev/null +++ b/src/my-place/user_places/location_listener_iface.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_LOCATION_LISTENER_IFACE_H_ +#define _CONTEXT_PLACE_RECOGNITION_LOCATION_LISTENER_IFACE_H_ + +#include "user_places_types.h" + +namespace ctx { + + class ILocationListener { + + public: + virtual ~ILocationListener() {}; + virtual void onNewLocation(LocationEvent location) = 0; + + }; /* class ILocationListener */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_LOCATION_LISTENER_IFACE_H_ */ diff --git a/src/my-place/user_places/location_logger.cpp b/src/my-place/user_places/location_logger.cpp new file mode 100644 index 0000000..0994734 --- /dev/null +++ b/src/my-place/user_places/location_logger.cpp @@ -0,0 +1,617 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include +#include "../place_recognition_types.h" +#include "user_places_params.h" +#include "debug_utils.h" +#include "location_logger.h" + +#ifdef TIZEN_ENGINEER_MODE +#define __LOCATION_CREATE_TABLE_COLUMNS \ + LOCATION_COLUMN_LATITUDE " REAL NOT NULL, "\ + LOCATION_COLUMN_LONGITUDE " REAL NOT NULL, "\ + LOCATION_COLUMN_ACCURACY " REAL, "\ + LOCATION_COLUMN_TIMESTAMP " timestamp NOT NULL, "\ + LOCATION_COLUMN_TIMESTAMP_HUMAN " TEXT, "\ + LOCATION_COLUMN_METHOD " INTEGER " +#else /* TIZEN_ENGINEER_MODE */ +#define __LOCATION_CREATE_TABLE_COLUMNS \ + LOCATION_COLUMN_LATITUDE " REAL NOT NULL, "\ + LOCATION_COLUMN_LONGITUDE " REAL NOT NULL, "\ + LOCATION_COLUMN_ACCURACY " REAL, "\ + LOCATION_COLUMN_TIMESTAMP " timestamp NOT NULL " +#endif /* TIZEN_ENGINEER_MODE */ + +#define __LOCATION_ERROR_LOG(error) { \ + if (error != LOCATIONS_ERROR_NONE) { \ + _E("ERROR == %s", __locationError2Str(error)); \ + } else { \ + _D("SUCCESS"); \ + } \ +} + +void ctx::LocationLogger::__locationServiceStateChangedCb(location_service_state_e state, void *userData) +{ + ctx::LocationLogger* locationLogger = (ctx::LocationLogger *)userData; + locationLogger->__locationServiceState = state; + if (state == LOCATIONS_SERVICE_ENABLED) { + _D("LOCATIONS_SERVICE_ENABLED"); + switch (locationLogger->__timerPurpose) { + case LOCATION_LOGGER_WAITING_FOR_SERVICE_START: + _D("Waiting for location service start FINISHED"); + locationLogger->__timerStop(); + locationLogger->__locationRequest(); + break; + case LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST: + case LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON: + case LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL: + case LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL: + default: + // Do nothing + break; + } + } else { + _D("LOCATIONS_SERVICE_DISABLED"); +// locationLogger->__timerStop(); + } +} + +void ctx::LocationLogger::__locationSettingChangedCb(location_method_e method, bool enable, void *userData) +{ + ctx::LocationLogger* locationLogger = (ctx::LocationLogger *)userData; + locationLogger->__locationMethodState = enable; + if (method == locationLogger->__locationMethod) { + if (enable) { + _D("Location method settings ON"); + switch (locationLogger->__timerPurpose) { + case LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON: + _D("Waiting for location method settings on FINISHED"); + if (locationLogger->__locationServiceState == LOCATIONS_SERVICE_ENABLED) { + locationLogger->__timerStop(); + locationLogger->__locationRequest(); + } else { + locationLogger->__locationManagerStart(); + } + break; + case LOCATION_LOGGER_WAITING_FOR_SERVICE_START: + case LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST: + case LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL: + case LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL: + default: + // Do nothing + break; + } + } else { + _D("Location method settings OFF"); +// locationLogger->__timerStop(); + } + } +} + +void ctx::LocationLogger::__positionUpdatedCb(double latitude, double longitude, + double altitude, time_t timestamp, void *userData) +{ + _D(""); + ctx::LocationLogger* locationLogger = (ctx::LocationLogger *)userData; + double horizontal = locationLogger->__locationManagerGetHorizontalAccuracy(); +#ifdef TIZEN_ENGINEER_MODE + ctx::LocationEvent location(latitude, longitude, horizontal, timestamp, LOCATION_METHOD_REQUEST); +#else /* TIZEN_ENGINEER_MODE */ + ctx::LocationEvent location(latitude, longitude, horizontal, timestamp); +#endif /* TIZEN_ENGINEER_MODE */ + locationLogger->__broadcast(location); + locationLogger->__onActiveRequestSucceeded(); +} + +void ctx::LocationLogger::__locationUpdatedCb(location_error_e error, double latitude, double longitude, + double altitude, time_t timestamp, double speed, double direction, double climb, void *userData) +{ + _D(""); + __positionUpdatedCb(latitude, longitude, altitude, timestamp, userData); +} + +const char* ctx::LocationLogger::__locationError2Str(int error) +{ + switch (error) { + case LOCATIONS_ERROR_NONE: + return "LOCATIONS_ERROR_NONE"; + case LOCATIONS_ERROR_OUT_OF_MEMORY: + return "LOCATIONS_ERROR_OUT_OF_MEMORY"; + case LOCATIONS_ERROR_INVALID_PARAMETER: + return "LOCATIONS_ERROR_INVALID_PARAMETER"; + case LOCATIONS_ERROR_ACCESSIBILITY_NOT_ALLOWED: + return "LOCATIONS_ERROR_ACCESSIBILITY_NOT_ALLOWED"; + case LOCATIONS_ERROR_NOT_SUPPORTED: + return "LOCATIONS_ERROR_NOT_SUPPORTED"; + case LOCATIONS_ERROR_INCORRECT_METHOD: + return "LOCATIONS_ERROR_INCORRECT_METHOD"; + case LOCATIONS_ERROR_NETWORK_FAILED: + return "LOCATIONS_ERROR_NETWORK_FAILED"; + case LOCATIONS_ERROR_SERVICE_NOT_AVAILABLE: + return "LOCATIONS_ERROR_SERVICE_NOT_AVAILABLE"; + case LOCATIONS_ERROR_GPS_SETTING_OFF: + return "LOCATIONS_ERROR_GPS_SETTING_OFF"; + case LOCATIONS_ERROR_SECURITY_RESTRICTED: + return "LOCATIONS_ERROR_SECURITY_RESTRICTED"; + default: + return "unknown location error code"; + } +} + + +void ctx::LocationLogger::__log(location_accessibility_state_e state) +{ + switch (state) { + case LOCATIONS_ACCESS_STATE_NONE : // Access state is not determined + _D("LOCATIONS_ACCESS_STATE_NONE "); + break; + case LOCATIONS_ACCESS_STATE_DENIED: // Access denied + _D("LOCATIONS_ACCESS_STATE_DENIED"); + break; + case LOCATIONS_ACCESS_STATE_ALLOWED: // Access authorized + _D("LOCATIONS_ACCESS_STATE_ALLOWED"); + break; + default: + break; + } +} + +int ctx::LocationLogger::__dbCreateTable() +{ + ctx::DatabaseManager dbManager; + bool ret = dbManager.createTable(0, LOCATION_TABLE_NAME, __LOCATION_CREATE_TABLE_COLUMNS, NULL, NULL); + _D("%s -> Table Creation Request", ret ? "SUCCESS" : "FAIL"); + return 0; +} + +int ctx::LocationLogger::__dbInsertLog(LocationEvent locationEvent) +{ + Json data; + data.set(NULL, LOCATION_COLUMN_LATITUDE, locationEvent.coordinates.latitude); + data.set(NULL, LOCATION_COLUMN_LONGITUDE, locationEvent.coordinates.longitude); + data.set(NULL, LOCATION_COLUMN_ACCURACY, locationEvent.coordinates.accuracy); + data.set(NULL, LOCATION_COLUMN_TIMESTAMP, static_cast(locationEvent.timestamp)); +#ifdef TIZEN_ENGINEER_MODE + std::string timeHuman = DebugUtils::humanReadableDateTime(locationEvent.timestamp, "%F %T", 80); + data.set(NULL, LOCATION_COLUMN_TIMESTAMP_HUMAN, timeHuman); + data.set(NULL, LOCATION_COLUMN_METHOD, static_cast(locationEvent.method)); +#endif /* TIZEN_ENGINEER_MODE */ + + ctx::DatabaseManager dbManager; + int64_t rowId; + bool ret = dbManager.insertSync(LOCATION_TABLE_NAME, data, &rowId); + _D("%s -> DB: location table insert result", ret ? "SUCCESS" : "FAIL"); + return ret; +} + +ctx::LocationLogger::LocationLogger(ILocationListener *listener, bool testMode) : + __listener(listener), + __testMode(testMode), + __activeRequestAttempts(0), + __activeAttempts(0), + __allAttempts(0), + __locationCount(0), + __activeRequestSucceeded(false), + __activeLocationSucceeded(false), + __timerId(-1), + __timerTimestamp(0), + __timerPurpose(LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL), + __locationServiceState(LOCATIONS_SERVICE_DISABLED), + __locationMethod(LOCATION_LOGGER_METHOD), + __locationMethodState(false) +{ + _D("CONSTRUCTOR"); + + __locationManagerCreate(); + + if (__testMode) { + return; + } + if (LOCATION_LOGGER_DATABASE) { + __dbCreateTable(); + } + + __locationManagerSetServiceStateChangedCb(); + __locationManagerSetSettingChangedCb(); + __locationMethodState = __locationManagerIsEnabledMethod(__locationMethod); +} + +ctx::LocationLogger::~LocationLogger() +{ + _D("DESTRUCTOR"); + __stopLogging(); + __locationManagerUnsetServiceStateChangedCb(); + __locationManagerUnsetSettingChangedCb(); + __locationManagerDestroy(); +} + +void ctx::LocationLogger::__locationManagerCreate() +{ + int ret = location_manager_create(__locationMethod, &__locationManager); + __LOCATION_ERROR_LOG(ret); +} + +void ctx::LocationLogger::__locationManagerDestroy() +{ + int ret = location_manager_destroy(__locationManager); + __LOCATION_ERROR_LOG(ret); +} + +void ctx::LocationLogger::__locationManagerSetServiceStateChangedCb() +{ + int ret = location_manager_set_service_state_changed_cb(__locationManager, __locationServiceStateChangedCb, this); + __LOCATION_ERROR_LOG(ret); +} + +void ctx::LocationLogger::__locationManagerUnsetServiceStateChangedCb() +{ + int ret = location_manager_unset_service_state_changed_cb(__locationManager); + __LOCATION_ERROR_LOG(ret); +} + +void ctx::LocationLogger::__locationManagerStart() +{ + int ret = location_manager_start(__locationManager); + __LOCATION_ERROR_LOG(ret); + __startServiceTimerStart(); +} + +void ctx::LocationLogger::__locationManagerStop() +{ + int ret = location_manager_stop(__locationManager); + __LOCATION_ERROR_LOG(ret); +} + +double ctx::LocationLogger::__locationManagerGetHorizontalAccuracy() +{ + location_accuracy_level_e accuracyLevel; + double horizontal, vertical; + int ret = location_manager_get_accuracy(__locationManager, &accuracyLevel, &horizontal, &vertical); + __LOCATION_ERROR_LOG(ret); + return horizontal; +} + +location_accessibility_state_e ctx::LocationLogger::__locationManagerGetAccessibilityState() +{ + location_accessibility_state_e state; + int ret = location_manager_get_accessibility_state(&state); + __LOCATION_ERROR_LOG(ret); + return state; +} + +void ctx::LocationLogger::__locationManagerSetSettingChangedCb() +{ + int ret = location_manager_set_setting_changed_cb(__locationMethod, __locationSettingChangedCb, this); + __LOCATION_ERROR_LOG(ret); +} + +void ctx::LocationLogger::__locationManagerUnsetSettingChangedCb() +{ + int ret = location_manager_unset_setting_changed_cb(__locationMethod); + __LOCATION_ERROR_LOG(ret); +} + +bool ctx::LocationLogger::__locationManagerRequestSingleLocation() +{ + int ret = location_manager_request_single_location(__locationManager, + LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS, __locationUpdatedCb, this); + _D("%s (seconds=%d) ----- ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d]", + ret == LOCATIONS_ERROR_NONE ? "SUCCESS" : "ERROR", + LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS, + __activeRequestAttempts, + LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, + __activeAttempts, + LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, + __allAttempts, + LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, + __locationCount, + LOCATION_LOGGER_MAX_LOCATION_COUNT); + __LOCATION_ERROR_LOG(ret); + __activeRequestAttempts++; + __activeAttempts++; + __allAttempts++; + if (ret == LOCATIONS_ERROR_NONE) { + __activeRequestTimerStart(); + return true; + } else { + return false; + } +} + +bool ctx::LocationLogger::__locationManagerGetLocation() +{ + double altitude, latitude, longitude, climb, direction, speed, horizontal, vertical; + location_accuracy_level_e level; + time_t timestamp; + int ret = location_manager_get_location(__locationManager, &altitude, &latitude, &longitude, + &climb, &direction, &speed, &level, &horizontal, &vertical, ×tamp); + _D("%s ----- ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d]", + ret == LOCATIONS_ERROR_NONE ? "SUCCESS" : "ERROR", + __activeRequestAttempts, + LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, + __activeAttempts, + LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, + __allAttempts, + LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, + __locationCount, + LOCATION_LOGGER_MAX_LOCATION_COUNT); + __LOCATION_ERROR_LOG(ret); + __activeAttempts++; + __allAttempts++; + if (ret == LOCATIONS_ERROR_NONE) { +#ifdef TIZEN_ENGINEER_MODE + ctx::LocationEvent location(latitude, longitude, horizontal, timestamp, LOCATION_METHOD_GET_LOCATION); +#else /* TIZEN_ENGINEER_MODE */ + ctx::LocationEvent location(latitude, longitude, horizontal, timestamp); +#endif /* TIZEN_ENGINEER_MODE */ + __broadcast(location); + __onActiveLocationSucceeded(); + return true; + } else { + return false; + } +} + +void ctx::LocationLogger::__locationManagerGetLastLocation() +{ + double altitude, latitude, longitude, climb, direction, speed, horizontal, vertical; + location_accuracy_level_e level; + time_t timestamp; + int ret = location_manager_get_last_location(__locationManager, &altitude, &latitude, &longitude, + &climb, &direction, &speed, &level, &horizontal, &vertical, ×tamp); + _D("%s ----- ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d]", + ret == LOCATIONS_ERROR_NONE ? "SUCCESS" : "ERROR", + __activeRequestAttempts, + LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, + __activeAttempts, + LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, + __allAttempts, + LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, + __locationCount, + LOCATION_LOGGER_MAX_LOCATION_COUNT); + __LOCATION_ERROR_LOG(ret); + __allAttempts++; + if (ret == LOCATIONS_ERROR_NONE) { +#ifdef TIZEN_ENGINEER_MODE + ctx::LocationEvent location(latitude, longitude, horizontal, timestamp, LOCATION_METHOD_GET_LAST_LOCATION); +#else /* TIZEN_ENGINEER_MODE */ + ctx::LocationEvent location(latitude, longitude, horizontal, timestamp); +#endif /* TIZEN_ENGINEER_MODE */ + __broadcast(location); + } +} + +bool ctx::LocationLogger::__locationManagerIsEnabledMethod(location_method_e method) +{ + bool enable; + int ret = location_manager_is_enabled_method(method, &enable); + __LOCATION_ERROR_LOG(ret); + return enable; +} + +bool ctx::LocationLogger::__checkGeneralLimits() +{ + return (__locationCount < LOCATION_LOGGER_MAX_LOCATION_COUNT + && __allAttempts < LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS); +} + +bool ctx::LocationLogger::__checkActiveLimits() +{ + return (!__activeLocationSucceeded + && __activeAttempts < LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS); +} + +bool ctx::LocationLogger::__checkActiveRequestLimits() +{ + return (!__activeRequestSucceeded + && __activeRequestAttempts < LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS); +} + +void ctx::LocationLogger::__locationRequest() +{ + _D(""); + bool requestSingleLocationRet = false; + bool getLocationRet = false; + if (__checkGeneralLimits() && __checkActiveLimits() && __checkActiveRequestLimits()) { + requestSingleLocationRet = __locationManagerRequestSingleLocation(); + } + if (__checkGeneralLimits() && __checkActiveLimits() && !requestSingleLocationRet) { + getLocationRet = __locationManagerGetLocation(); + } + if (__checkGeneralLimits() && !requestSingleLocationRet && !getLocationRet + && __activeAttempts >= LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS) { + __locationManagerGetLastLocation(); + } + if (!requestSingleLocationRet) { + __locationManagerStop(); + __setNextTimer(); + } +} + +void ctx::LocationLogger::__setNextTimer() +{ + _D("ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d])", + __activeRequestAttempts, + LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, + __activeAttempts, + LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, + __allAttempts, + LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, + __locationCount, + LOCATION_LOGGER_MAX_LOCATION_COUNT); + if (__checkGeneralLimits()) { + if (__checkActiveLimits()) { + __activeIntervalTimerStart(); + } else { + __passiveIntervalTimerStart(); + } + } +} + +void ctx::LocationLogger::__onActiveRequestSucceeded() +{ + _D(""); + __locationManagerStop(); + __activeRequestSucceeded = true; + __onActiveLocationSucceeded(); +} + +void ctx::LocationLogger::__onActiveLocationSucceeded() +{ + _D(""); + __activeLocationSucceeded = true; +} + +void ctx::LocationLogger::__broadcast(ctx::LocationEvent locationEvent) +{ + _D(""); + __locationCount++; + if (__listener) { + __listener->onNewLocation(locationEvent); + } + if (LOCATION_LOGGER_DATABASE) { + __dbInsertLog(locationEvent); + } +} + +bool ctx::LocationLogger::onTimerExpired(int id) +{ + time_t now = time(nullptr); + double seconds = difftime(now, __timerTimestamp); + + switch (__timerPurpose) { + case LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST: + _D("Active request FAILED, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); + __locationManagerStop(); + __setNextTimer(); + return false; + case LOCATION_LOGGER_WAITING_FOR_SERVICE_START: + _D("Service start in timeout time FAILED, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); + // Waiting for service start FAILURE is also some kind of active request attempt + __activeRequestAttempts++; + __activeAttempts++; + __allAttempts++; + __locationManagerStop(); + __setNextTimer(); + return false; + case LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON: + _D("Still waiting for Location method settings on, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); + // Do nothing + return false; + case LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL: + _D("Active interval time expired, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); + break; + case LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL: + _D("Passive interval time expired, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); + break; + default: + _D("Do nothing, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); + return false; + } + if (__locationMethodState) { + __locationManagerStart(); + } else { + __timerPurpose = LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON; + _D("LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON"); + } + return false; +} + +void ctx::LocationLogger::__activeRequestTimerStart() +{ + int minutes = LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS / 60; + if (LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS % 60) { + minutes++; + } + __timerPurpose = LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST; + _D("LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST (minutes=%d)", minutes); + __timerStart(minutes); +} + +void ctx::LocationLogger::__startServiceTimerStart() +{ + __timerPurpose = LOCATION_LOGGER_WAITING_FOR_SERVICE_START; + _D("LOCATION_LOGGER_WAITING_FOR_SERVICE_START"); + __timerStart(LOCATION_LOGGER_SERVICE_START_TIMEOUT_MINUTES); +} + +void ctx::LocationLogger::__activeIntervalTimerStart() +{ + __timerPurpose = LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL; + _D("LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL"); + __timerStart(LOCATION_LOGGER_ACTIVE_INTERVAL_MINUTES); +} + +void ctx::LocationLogger::__passiveIntervalTimerStart() +{ + __timerPurpose = LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL; + _D("LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL"); + __timerStart(LOCATION_LOGGER_PASSIVE_INTERVAL_MINUTES); +} + +void ctx::LocationLogger::__timerStart(time_t minutes) +{ + __timerTimestamp = time(nullptr); + __timerId = __timerManager.setFor(minutes, this); + _D("%s (minutes=%d) timerId = %d", __timerId >= 0 ? "SUCCESS" : "ERROR", minutes, __timerId); +} + +void ctx::LocationLogger::__timerStop() +{ + _D(""); + __timerManager.remove(__timerId); +} + +void ctx::LocationLogger::__startLogging() +{ + _D(""); + __activeRequestAttempts = 0; + __activeAttempts = 0; + __allAttempts = 0; + __locationCount = 0; + __activeRequestSucceeded = false;; + __activeLocationSucceeded = false; + __locationManagerStart(); +} + +void ctx::LocationLogger::__stopLogging() +{ + _D(""); + __timerStop(); + __locationManagerStop(); +} + +void ctx::LocationLogger::onVisitStart() +{ + _D(""); + if (!__testMode) { + __startLogging(); + } +} + +void ctx::LocationLogger::onVisitEnd() +{ + _D(""); + if (!__testMode) { + __stopLogging(); + } +} + +#undef __LOCATION_ERROR_LOG diff --git a/src/my-place/user_places/location_logger.h b/src/my-place/user_places/location_logger.h new file mode 100644 index 0000000..ae4c9bd --- /dev/null +++ b/src/my-place/user_places/location_logger.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_LOCATION_LOGGER_H_ +#define _CONTEXT_PLACE_RECOGNITION_LOCATION_LOGGER_H_ + +#include +#include +#include "visit_listener_iface.h" +#include "location_listener_iface.h" + +/* Database usage flag */ +#define LOCATION_LOGGER_DATABASE false // TODO: false in final solution + +/* Locations measure method */ +#define LOCATION_LOGGER_METHOD LOCATIONS_METHOD_HYBRID + +/* TIMEOUTS: Location active measure request timeout (in seconds). */ +#define LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS 100 + +/* TIMEOUTS: Location service start timeout (in minutes). */ +#define LOCATION_LOGGER_SERVICE_START_TIMEOUT_MINUTES 2 + +/* FREQUENCIES/INTERVALS: "Active" measure attempts frequency (in minutes) */ +#define LOCATION_LOGGER_ACTIVE_INTERVAL_MINUTES 5 + +/* FREQUENCIES/INTERVALS: "Passive" measure attempts frequency (in minutes) */ +#define LOCATION_LOGGER_PASSIVE_INTERVAL_MINUTES 30 + +/* ATTEMTS LIMITS: "Active" request attempts limit (must be <= than active location attempts) */ +#define LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS 0 + +/* ATTEMTS LIMITS: "Active" measures attempts limit (must be <= than all attempts limit) */ +#define LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS 2 + +/* ATTEMTS LIMITS: All attempts ("active" + "passive") limit */ +#define LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS 3 + +/* LOCATION LIMIT: Location count limit per visit */ +#define LOCATION_LOGGER_MAX_LOCATION_COUNT 3 + +namespace ctx { + + enum TimerPurpose { + LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST = 0, + LOCATION_LOGGER_WAITING_FOR_SERVICE_START = 1, + LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON = 2, + LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL = 3, + LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL = 4 + }; + + class LocationLogger : public ITimerListener, public IVisitListener { + + public: + LocationLogger(ILocationListener *listener = nullptr, bool testMode = false); + ~LocationLogger(); + + private: + /* INPUT */ + void onVisitStart(); + void onVisitEnd(); + + /* OUTPUT */ + ILocationListener * const __listener; + void __broadcast(LocationEvent locationEvent); + + /* INTERNAL */ + bool __testMode; + void __startLogging(); + void __stopLogging(); + void __locationRequest(); + void __onActiveRequestSucceeded(); + void __onActiveLocationSucceeded(); + + /* INTERNAL : COUNTERS (LIMITS) */ + int __activeRequestAttempts; + int __activeAttempts; + int __allAttempts; + int __locationCount; + bool __checkGeneralLimits(); + bool __checkActiveLimits(); + bool __checkActiveRequestLimits(); + + /* INTERNAL : FLAGS */ + bool __activeRequestSucceeded; + bool __activeLocationSucceeded; + + /* TIMER */ + int __timerId; + time_t __timerTimestamp; + TimerManager __timerManager; + TimerPurpose __timerPurpose; + void __setNextTimer(); + void __activeRequestTimerStart(); + void __startServiceTimerStart(); + void __activeIntervalTimerStart(); + void __passiveIntervalTimerStart(); + void __timerStart(time_t minutes); + void __timerStop(); + bool onTimerExpired(int timerId); + + /* DATABASE */ + static int __dbCreateTable(); + int __dbInsertLog(LocationEvent locationEvent); + + /* DEBUG */ + static const char* __locationError2Str(int error); + static void __log(location_accessibility_state_e state); + + /* LOCATION MANAGER */ + location_manager_h __locationManager; + void __locationManagerCreate(); + void __locationManagerDestroy(); + void __locationManagerStart(); + void __locationManagerStop(); + location_accessibility_state_e __locationManagerGetAccessibilityState(); + + /* LOCATION MANAGER : LOCATION SERVICE STATE */ + location_service_state_e __locationServiceState; + static void __locationServiceStateChangedCb(location_service_state_e state, void *userData); + void __locationManagerSetServiceStateChangedCb(); + void __locationManagerUnsetServiceStateChangedCb(); + + /* LOCATION MANAGER : LOCATION METHOD SETTINGS */ + location_method_e __locationMethod; + bool __locationMethodState; + bool __locationManagerIsEnabledMethod(location_method_e method); + static void __locationSettingChangedCb(location_method_e method, bool enable, void *userData); + void __locationManagerSetSettingChangedCb(); + void __locationManagerUnsetSettingChangedCb(); + + /* LOCATION MANAGER : LOCATION */ + double __locationManagerGetHorizontalAccuracy(); + + /* LOCATION MANAGER : LOCATION : SYNCHRONOUS */ + bool __locationManagerGetLocation(); + void __locationManagerGetLastLocation(); + + /* LOCATION MANAGER : LOCATION : ASYNCHRONOUS */ + static void __positionUpdatedCb(double latitude, double longitude, + double altitude, time_t timestamp, void *userData); + static void __locationUpdatedCb(location_error_e error, double latitude, + double longitude, double altitude, time_t timestamp, double speed, + double direction, double climb, void *userData); + bool __locationManagerRequestSingleLocation(); + + }; /* class LocationLogger */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_LOCATION_LOGGER_H_ */ diff --git a/src/my-place/user_places/mahal.cpp b/src/my-place/user_places/mahal.cpp new file mode 100644 index 0000000..ccc7f9f --- /dev/null +++ b/src/my-place/user_places/mahal.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "mahal.h" +#include +#include + +ctx::num_t ctx::MahalModel::distance(const std::vector &v1, const std::vector &v2, const std::vector &m) +{ + size_t n = v1.size(); + if (m.size() != n * n) { + _E("m.size() != n * n"); + return 0.0; // this value does not make any sense + } + + std::vector diff(n); + for (size_t i = 0; i < n; i++) { + diff[i] = v2[i] - v1[i]; + } + + num_t dist2 = 0; // squared distance + for (size_t j = 0; j < n; j++) { + for (size_t i = 0; i < n; i++) { + dist2 += m[i * n + j] * diff[i] * diff[j]; + } + } + return sqrt(dist2); +} + +ctx::num_t ctx::MahalModel::distance(const std::vector &v) +{ + return distance(v, __mean, __sigma); +} diff --git a/src/my-place/user_places/mahal.h b/src/my-place/user_places/mahal.h new file mode 100644 index 0000000..9e733c7 --- /dev/null +++ b/src/my-place/user_places/mahal.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_MAHAL_H_ +#define _CONTEXT_PLACE_RECOGNITION_MAHAL_H_ + +#include +#include "user_places_types.h" + +namespace ctx { + + /* + * Class for Mahalanobis distance computation. + */ + class MahalModel { + + private: + std::vector __mean; + std::vector __sigma; // represents square matrix row-wise + + public: + static num_t distance(const std::vector &v1, const std::vector &v2, const std::vector &m); + MahalModel(std::vector mean, std::vector sigma) : + __mean(mean), + __sigma(sigma) { } + num_t distance(const std::vector &v); + + }; /* class MahalModel */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_MAHAL_H_ */ diff --git a/src/my-place/user_places/median.cpp b/src/my-place/user_places/median.cpp new file mode 100644 index 0000000..f0463b3 --- /dev/null +++ b/src/my-place/user_places/median.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "median.h" + +ctx::num_t ctx::median(std::vector &v) +{ + if (v.empty()) { + _E("Median of empty set"); + return 0; // this value does not make any sense + } + size_t n = v.size() / 2; + std::nth_element(v.begin(), v.begin() + n, v.end()); + num_t vn = v[n]; + if (v.size() % 2 == 1) { + return vn; + } else { + std::nth_element(v.begin(), v.begin() + n - 1, v.end()); + return 0.5 * (vn + v[n - 1]); + } +} diff --git a/src/my-place/user_places/median.h b/src/my-place/user_places/median.h new file mode 100644 index 0000000..70461ae --- /dev/null +++ b/src/my-place/user_places/median.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_MEDIAN_ +#define _CONTEXT_PLACE_RECOGNITION_MEDIAN_ + +#include "user_places_types.h" +#include +#include "../place_recognition_types.h" + +namespace ctx { + + num_t median(std::vector &values); // caution: the input vector will be sorted + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_MEDIAN_ */ diff --git a/src/my-place/user_places/piecewise_lin.cpp b/src/my-place/user_places/piecewise_lin.cpp new file mode 100644 index 0000000..638af66 --- /dev/null +++ b/src/my-place/user_places/piecewise_lin.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "piecewise_lin.h" +#include + +ctx::PiecewiseLin::PiecewiseLin(std::vector xs, std::vector vs) : + __xs(xs), + __vs(vs), + __n(xs.size()) +{ + if (xs.size() != vs.size()) { + _E("Input arguments have different sizes"); + return; + } +} + +ctx::num_t ctx::PiecewiseLin::value(num_t x) +{ + if (x <= __xs[0]) { + return __vs[0]; + } else if (x >= __xs[__n-1]) { + return __vs[__n - 1]; + } else { + num_t xp = __xs[0]; + for (size_t i = 1; i < __n; i++) { + num_t xn = __xs[i]; + if (x <= xn) { + num_t d = xn - xp; + num_t dxp = x - xp; + num_t dxn = xn - x; + return (dxn * __vs[i-1] + dxp * __vs[i]) / d; + } + xp = xn; + } + } + _E("Function should return result earlier"); + return 0.0; // this value does not make any sense +} diff --git a/src/my-place/user_places/piecewise_lin.h b/src/my-place/user_places/piecewise_lin.h new file mode 100644 index 0000000..0ef4bff --- /dev/null +++ b/src/my-place/user_places/piecewise_lin.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_PIECEWISE_LIN_ +#define _CONTEXT_PLACE_RECOGNITION_PIECEWISE_LIN_ + +#include "user_places_types.h" + +namespace ctx { + + /* + * Piecewise linear function. Used for approximation. + */ + class PiecewiseLin { + + private: + std::vector __xs; // nodes + std::vector __vs; // values in nodes + size_t __n; + + public: + PiecewiseLin(std::vector xs, std::vector vs); + num_t value(num_t x); + + }; /* PiecewiseLin */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_PIECEWISE_LIN_ */ diff --git a/src/my-place/user_places/place_categer.cpp b/src/my-place/user_places/place_categer.cpp new file mode 100644 index 0000000..1b4c975 --- /dev/null +++ b/src/my-place/user_places/place_categer.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "place_categer.h" +#include "median.h" +#include "../place_recognition_types.h" +#include "user_places_params.h" +#include "user_places_types.h" +#include +#include + +void ctx::PlaceCateger::reduceOutliers(ctx::Visits &visits) +{ + int size = visits.size(); + visits.erase(std::remove_if( + visits.begin(), + visits.end(), + [](Visit v)->bool { + return v.categs[PLACE_CATEG_ID_HOME] < PLACES_CATEGER_MIN_VISITS_SCORE + && v.categs[PLACE_CATEG_ID_WORK] < PLACES_CATEGER_MIN_VISITS_SCORE + && v.categs[PLACE_CATEG_ID_OTHER] < PLACES_CATEGER_MIN_VISITS_SCORE; + }), + visits.end()); + int newSize = visits.size(); + if (size != newSize) { + _D("Visits number from %d to %d (visits min scores checking)", size, newSize); + } +} + +/* + * Change category if home or work has to few visits + */ +bool ctx::PlaceCateger::__reduceCategory(const PlaceCategId &categId, const ctx::Visits &visits) +{ + return (categId == PLACE_CATEG_ID_HOME && visits.size() < PLACES_CATEGER_MIN_VISITS_PER_HOME) + || (categId == PLACE_CATEG_ID_WORK && visits.size() < PLACES_CATEGER_MIN_VISITS_PER_WORK); +} + +void ctx::PlaceCateger::categorize(ctx::Visits &visits, ctx::Place &place) +{ + reduceOutliers(visits); + + place.categId = PLACE_CATEG_ID_NONE; + place.categConfidence = 0.0; + + if (!visits.empty()) { + const std::vector categIds = { + PLACE_CATEG_ID_HOME, + PLACE_CATEG_ID_WORK, + PLACE_CATEG_ID_OTHER + }; + num_t sumScore = 0.0; + num_t maxScore = 0.0; + for (PlaceCategId categId : categIds) { + std::vector categVector = categVectorFromVisits(visits, categId); + num_t score = median(categVector); + sumScore += score; + if (score > maxScore) { + maxScore = score; + place.categId = categId; + } + } + if (sumScore > 0) { + place.categConfidence = maxScore / sumScore; + } + if (__reduceCategory(place.categId, visits)) { + place.categId = PLACE_CATEG_ID_OTHER; + place.categConfidence = 0.0; + } + } + + place.name = categId2Name(place.categId); +} + +std::vector ctx::PlaceCateger::categVectorFromVisits(const ctx::Visits &visits, PlaceCategId categId) +{ + std::vector vec; + for (auto &visit : visits) { + auto search = visit.categs.find(categId); + if (search != visit.categs.end()) { + vec.push_back(search->second); + } + } + return vec; +} + +std::string ctx::PlaceCateger::categId2Name(PlaceCategId categId) { + switch (categId) { + case PLACE_CATEG_ID_HOME: + return "home"; + case PLACE_CATEG_ID_WORK: + return "work"; + case PLACE_CATEG_ID_OTHER: + return "other"; + case PLACE_CATEG_ID_NONE: + return "none"; + default: + return ""; + } +} diff --git a/src/my-place/user_places/place_categer.h b/src/my-place/user_places/place_categer.h new file mode 100644 index 0000000..0d127b1 --- /dev/null +++ b/src/my-place/user_places/place_categer.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_PLACE_CATEGER_ +#define _CONTEXT_PLACE_RECOGNITION_PLACE_CATEGER_ + +#include "user_places_types.h" +#include +#include +#include +#include "../place_recognition_types.h" + +namespace ctx { + + class PlaceCateger { + + private: + static bool __reduceCategory(const PlaceCategId &categId, const ctx::Visits &visits); + + public: + static void reduceOutliers(Visits &visits); // TODO: move to private + static std::vector categVectorFromVisits(const ctx::Visits &visits, PlaceCategId categId); // TODO: move to private + static void categorize(ctx::Visits &visits, ctx::Place &place); + static std::string categId2Name(PlaceCategId categId); // TODO: move to private + + }; /* class PlaceCateger */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_PLACE_CATEGER_ */ diff --git a/src/my-place/user_places/places_detector.cpp b/src/my-place/user_places/places_detector.cpp new file mode 100644 index 0000000..a48e395 --- /dev/null +++ b/src/my-place/user_places/places_detector.cpp @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "similarity.h" +#include "places_detector.h" +#include "place_categer.h" +#include "graph.h" +#include "median.h" +#ifdef TIZEN_ENGINEER_MODE +#include "gmap.h" +#endif /* TIZEN_ENGINEER_MODE */ +#include "../place_recognition_types.h" +#include +#include +#include "user_places_params.h" + +#define __DELETE_PLACES_QUERY "DELETE FROM " PLACE_TABLE + +#ifdef TIZEN_ENGINEER_MODE +#define __USER_PLACES_FILE "/opt/usr/media/Others/user_places.txt" // TODO: Only for debug purposes -> Remove in final solution +#endif /* TIZEN_ENGINEER_MODE */ + +#define __GET_VISITS_QUERY "SELECT "\ + VISIT_COLUMN_END_TIME ", "\ + VISIT_COLUMN_START_TIME ", "\ + VISIT_COLUMN_WIFI_APS ", "\ + VISIT_COLUMN_LOCATION_VALID ", "\ + VISIT_COLUMN_LOCATION_LATITUDE ", "\ + VISIT_COLUMN_LOCATION_LONGITUDE ", " \ + VISIT_COLUMN_CATEG_HOME ", "\ + VISIT_COLUMN_CATEG_WORK ", "\ + VISIT_COLUMN_CATEG_OTHER \ + " FROM " VISIT_TABLE + +#define __GET_PLACES_QUERY "SELECT "\ + PLACE_COLUMN_CATEG_ID ", "\ + PLACE_COLUMN_CATEG_CONFIDENCE ", "\ + PLACE_COLUMN_NAME ", "\ + PLACE_COLUMN_LOCATION_VALID ", "\ + PLACE_COLUMN_LOCATION_LATITUDE ", "\ + PLACE_COLUMN_LOCATION_LONGITUDE ", " \ + PLACE_COLUMN_WIFI_APS ", "\ + PLACE_COLUMN_CREATE_DATE \ + " FROM " PLACE_TABLE + +#define __PLACE_TABLE_COLUMNS \ + PLACE_COLUMN_CATEG_ID " INTEGER, "\ + PLACE_COLUMN_CATEG_CONFIDENCE " REAL, "\ + PLACE_COLUMN_NAME " TEXT, "\ + PLACE_COLUMN_LOCATION_VALID " INTEGER, "\ + PLACE_COLUMN_LOCATION_LATITUDE " REAL, "\ + PLACE_COLUMN_LOCATION_LONGITUDE " REAL, "\ + PLACE_COLUMN_WIFI_APS " STRING, "\ + PLACE_COLUMN_CREATE_DATE " timestamp" + +bool ctx::PlacesDetector::onTimerExpired(int timerId) +{ + _D(""); + __dbDeletePlaces(); + __dbDeleteOldVisits(); + std::vector records = __dbGetVisits(); + Visits visits = __visitsFromJsons(records); + __processVisits(visits); + return true; +} + +std::vector ctx::PlacesDetector::__dbGetVisits() +{ + std::vector records; + bool ret = __dbManager.executeSync(__GET_VISITS_QUERY, &records); + _D("load visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); + return records; +} + +std::vector ctx::PlacesDetector::__dbGetPlaces() +{ + std::vector records; + bool ret = __dbManager.executeSync(__GET_PLACES_QUERY, &records); + _D("load places execute query result: %s", ret ? "SUCCESS" : "FAIL"); + return records; +} + +double ctx::PlacesDetector::__doubleValueFromJson(Json &row, const char* key) +{ + double value; + row.get(NULL, key, &value); + _D("__doubleValueFromJson, key:%s, value: %lf", key, value); + return value; +} + +ctx::Categs ctx::PlacesDetector::__visitCategsFromJson(Json &row) +{ + Categs categs; + categs[PLACE_CATEG_ID_HOME] = __doubleValueFromJson(row, VISIT_COLUMN_CATEG_HOME); + categs[PLACE_CATEG_ID_WORK] = __doubleValueFromJson(row, VISIT_COLUMN_CATEG_WORK); + categs[PLACE_CATEG_ID_OTHER] = __doubleValueFromJson(row, VISIT_COLUMN_CATEG_OTHER); + return categs; +} + +ctx::Visit ctx::PlacesDetector::__visitFromJson(Json &row) +{ + int startTime; + int endTime; + std::string str; + row.get(NULL, VISIT_COLUMN_START_TIME, &startTime); + row.get(NULL, VISIT_COLUMN_END_TIME, &endTime); + row.get(NULL, VISIT_COLUMN_WIFI_APS, &str); + + std::stringstream ss; + ss << str; + std::shared_ptr macSet = std::make_shared(); + ss >> *macSet; + + Interval interval(startTime, endTime); + Categs categs = __visitCategsFromJson(row); + + Visit visit(interval, macSet, categs); + + { // location + int locationValidInt; + row.get(NULL, VISIT_COLUMN_LOCATION_VALID, &locationValidInt); + visit.locationValid = (bool) locationValidInt; + row.get(NULL, VISIT_COLUMN_LOCATION_LATITUDE, &(visit.location.latitude)); + row.get(NULL, VISIT_COLUMN_LOCATION_LONGITUDE, &(visit.location.longitude)); + } + + return visit; +} + +ctx::Visits ctx::PlacesDetector::__visitsFromJsons(std::vector& records) +{ + Visits visits; + _D("db_result: number of all visits: %d", records.size()); + + for (Json &row : records) { + Visit visit = __visitFromJson(row); + visits.push_back(visit); + } + _D("number of all visits in vector: %d", visits.size()); + return visits; +} + +std::shared_ptr ctx::PlacesDetector::__placeFromJson(Json &row) +{ + std::shared_ptr place = std::make_shared(); + { // category + int categId; + row.get(NULL, PLACE_COLUMN_CATEG_ID, &categId); + // This is due to the fact the JSON module API interface doesn't handle enum + place->categId = static_cast(categId); + } + row.get(NULL, PLACE_COLUMN_NAME, &(place->name)); + row.get(NULL, PLACE_COLUMN_WIFI_APS, &(place->wifiAps)); + { // location + int locationValidInt; + row.get(NULL, PLACE_COLUMN_LOCATION_VALID, &locationValidInt); + place->locationValid = (bool) locationValidInt; + row.get(NULL, PLACE_COLUMN_LOCATION_LATITUDE, &(place->location.latitude)); + row.get(NULL, PLACE_COLUMN_LOCATION_LONGITUDE, &(place->location.longitude)); + } + { // createDate + int createDate; + row.get(NULL, PLACE_COLUMN_CREATE_DATE, &(createDate)); + // This is due to the fact the JSON module API interface doesn't handle time_t + place->createDate = static_cast(createDate); + } + _D("db_result: categId: %d; place: name: %s; wifiAps: %s; locationValid: %d; latitude: %lf, longitude: %lf, createDate: %d", place->categId, place->name.c_str(), place->wifiAps.c_str(), place->locationValid, place->location.latitude, place->location.longitude, place->createDate); + return place; +} + +std::vector> ctx::PlacesDetector::__placesFromJsons(std::vector& records) +{ + std::vector> places; + _D("db_result: number of all places: %d", records.size()); + + for (Json &row : records) { + std::shared_ptr place = __placeFromJson(row); + places.push_back(place); + } + _D("number of all places in vector: %d", places.size()); + return places; +} + +void ctx::PlacesDetector::reduceOutliers(ctx::Visits &visits) +{ + int size = visits.size(); + visits.erase(std::remove_if( + visits.begin(), + visits.end(), + [](Visit v)->bool { + int minutes = (v.interval.end - v.interval.start) / 60; + return (minutes < PLACES_DETECTOR_MIN_VISIT_DURATION_MINUTES) + || (minutes > PLACES_DETECTOR_MAX_VISIT_DURATION_MINUTES); + }), + visits.end()); + int newSize = visits.size(); + if (size != newSize) { + _D("Visits number from %d to %d (to short and to long reduction)", size, newSize); + } +} + +void ctx::PlacesDetector::__processVisits(ctx::Visits &visits) +{ + reduceOutliers(visits); + + _D("__testMode = %d", __testMode); + auto components = __mergeVisits(visits); + std::vector> newDetectedPlaces; +#ifdef TIZEN_ENGINEER_MODE + std::vector placesVisits; // TODO: remove from final solution. +#endif /* TIZEN_ENGINEER_MODE */ + for (std::shared_ptr component : *components) { + // Small places outliers reduction + if (!__testMode && component->size() < PLACES_DETECTOR_MIN_VISITS_PER_BIG_PLACE) { + continue; + } + + std::shared_ptr merged = std::make_shared(); + for (graph::Node i : *component) { + merged->push_back(visits[i]); + } + std::shared_ptr place = __placeFromMergedVisits(*merged); + if (place->categId == PLACE_CATEG_ID_NONE) { + continue; + } + newDetectedPlaces.push_back(place); + if (!__testMode) { + __dbInsertPlace(*place); + } + +#ifdef TIZEN_ENGINEER_MODE + { // TODO: Only for debug -> remove in final solution + Visits placeVisits; + for (graph::Node i : *component) { + placeVisits.push_back(visits[i]); + } + placesVisits.push_back(placeVisits); + } +#endif /* TIZEN_ENGINEER_MODE */ + } + + __detectedPlacesUpdate(newDetectedPlaces); + +#ifdef TIZEN_ENGINEER_MODE + { // Print to file TODO: Only for debug -> remove in final solution + std::ofstream out(__USER_PLACES_FILE); + for (size_t i = 0; i < newDetectedPlaces.size(); i++) { + newDetectedPlaces[i]->print2Stream(out); + Visits placeVisits = placesVisits[i]; + for (Visit visit : placeVisits) { + visit.printShort2Stream(out); + } + } + out.close(); + Gmap::writeMap(newDetectedPlaces); + } +#endif /* TIZEN_ENGINEER_MODE */ +} + +/* + * Replace old places by new ones. + */ +void ctx::PlacesDetector::__detectedPlacesUpdate(std::vector> &newPlaces) +{ + _D(""); + // XXX: In case of thread safety issues use std::mutex to protect places list. + __detectedPlaces = newPlaces; +} + +void ctx::PlacesDetector::__mergeLocation(const Visits &visits, Place &place) +{ + place.locationValid = false; + std::vector latitudes; + std::vector longitudes; + for (const Visit& visit : visits) { + if (visit.locationValid) { + latitudes.push_back(visit.location.latitude); + longitudes.push_back(visit.location.longitude); + place.locationValid = true; + } + } + if (place.locationValid) { + place.location.latitude = median(latitudes); + place.location.longitude = median(longitudes); + } +} + +std::shared_ptr ctx::PlacesDetector::__placeFromMergedVisits(Visits &mergedVisits) +{ + std::shared_ptr place = std::make_shared(); + place->createDate = std::time(nullptr); + std::vector> macSets; + for (const Visit &visit : mergedVisits) { + macSets.push_back(visit.macSet); + } + std::shared_ptr allMacs = macSetsUnion(macSets); + std::stringstream ss; + ss << *allMacs; + place->wifiAps = ss.str(); + + __mergeLocation(mergedVisits, *place); + + PlaceCateger::categorize(mergedVisits, *place); + + return place; +} + +void ctx::PlacesDetector::reduceOutliers(std::shared_ptr &cc) +{ + int size = cc->size(); + cc->erase(std::remove_if(cc->begin(), + cc->end(), + [](std::shared_ptr &c)->bool { + return c->size() < PLACES_DETECTOR_MIN_VISITS_PER_PLACE; + }), + cc->end()); + int newSize = cc->size(); + if (size != newSize) { + _D("Connected components from %d to %d (min visit per place)", size, newSize); + } +} + +std::shared_ptr ctx::PlacesDetector::__mergeVisits(const std::vector &visits) +{ + auto graph = __graphFromVisits(visits); + auto cc = graph::connectedComponents(*graph); + reduceOutliers(cc); + return cc; +} + +std::shared_ptr ctx::PlacesDetector::__graphFromVisits(const std::vector &visits) +{ + std::shared_ptr graph = std::make_shared(); + graph->resize(visits.size()); + for (size_t i = 0; i < visits.size(); i++) { + (*graph)[i] = std::make_shared(); + for (size_t j = 0; j < i; j++) { + if (similarity::isJoint(*visits[i].macSet, *visits[j].macSet)) { + (*graph)[i]->insert(j); + (*graph)[j]->insert(i); + } + } + } + return graph; +} + +void ctx::PlacesDetector::__dbDeletePlaces() +{ + std::vector records; + bool ret = __dbManager.executeSync(__DELETE_PLACES_QUERY, &records); + _D("delete places execute query result: %s", ret ? "SUCCESS" : "FAIL"); +} + +void ctx::PlacesDetector::__dbDeleteOldVisits() +{ + time_t currentTime; + time(¤tTime); + time_t thresholdTime = currentTime - PLACES_DETECTOR_RETENTION_SECONDS; + __dbDeleteOlderVisitsThan(thresholdTime); +} + +void ctx::PlacesDetector::__dbDeleteOlderVisitsThan(time_t threshold) +{ + _D("deleting vistits older than: %d", threshold); + std::stringstream query; + query << "DELETE FROM " << VISIT_TABLE; + query << " WHERE " << VISIT_COLUMN_END_TIME << " < " << threshold; + // query << " AND 0"; // XXX: Always false condition. Uncomment it for not deleting any visit during development. + std::vector records; + bool ret = __dbManager.executeSync(query.str().c_str(), &records); + _D("delete old visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); +} + +ctx::PlacesDetector::PlacesDetector(bool testMode) : + __testMode(testMode) +{ + if (testMode) { + return; + } + __dbCreateTable(); + std::vector records = __dbGetPlaces(); + std::vector> dbPlaces = __placesFromJsons(records); + __detectedPlacesUpdate(dbPlaces); +} + +void ctx::PlacesDetector::__dbCreateTable() +{ + bool ret = __dbManager.createTable(0, PLACE_TABLE, __PLACE_TABLE_COLUMNS); + _D("db: place Table Creation Result: %s", ret ? "SUCCESS" : "FAIL"); +} + +void ctx::PlacesDetector::__dbInsertPlace(const Place &place) +{ + Json data; + data.set(NULL, PLACE_COLUMN_CATEG_ID, place.categId); + data.set(NULL, PLACE_COLUMN_CATEG_CONFIDENCE, place.categConfidence); + data.set(NULL, PLACE_COLUMN_NAME, place.name); + + data.set(NULL, PLACE_COLUMN_LOCATION_VALID, place.locationValid); + data.set(NULL, PLACE_COLUMN_LOCATION_LATITUDE, place.location.latitude); + data.set(NULL, PLACE_COLUMN_LOCATION_LONGITUDE, place.location.longitude); + + data.set(NULL, PLACE_COLUMN_WIFI_APS, place.wifiAps); + data.set(NULL, PLACE_COLUMN_CREATE_DATE, static_cast(place.createDate)); + + int64_t rowId; + bool ret = __dbManager.insertSync(PLACE_TABLE, data, &rowId); + _D("insert place execute query result: %s", ret ? "SUCCESS" : "FAIL"); +} + +std::vector> ctx::PlacesDetector::getPlaces() +{ + // XXX: In case of thread safety issues use std::mutex to protect places list. + return __detectedPlaces; +} diff --git a/src/my-place/user_places/places_detector.h b/src/my-place/user_places/places_detector.h new file mode 100644 index 0000000..6444539 --- /dev/null +++ b/src/my-place/user_places/places_detector.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_PLACES_DETECTOR_ +#define _CONTEXT_PLACE_RECOGNITION_PLACES_DETECTOR_ + +#include +#include +#include +#include +#include "visit_detector.h" +#include "user_places_types.h" + +namespace ctx { + + class PlacesDetector : public ITimerListener { + + private: + bool __testMode; + DatabaseManager __dbManager; + + double __doubleValueFromJson(Json &row, const char* key); + Categs __visitCategsFromJson(Json &row); + Visit __visitFromJson(Json &row); + Visits __visitsFromJsons(std::vector& records); + std::shared_ptr __placeFromJson(Json &row); + std::vector> __placesFromJsons(std::vector& records); + + std::shared_ptr __graphFromVisits(const std::vector &visits); + + void __dbCreateTable(); + void __dbDeletePlaces(); + void __dbDeleteOldVisits(); + void __dbDeleteOlderVisitsThan(time_t threshold); + std::vector __dbGetVisits(); + std::vector __dbGetPlaces(); + void __dbInsertPlace(const Place &place); + + std::shared_ptr __placeFromMergedVisits(Visits &mergedVisits); + std::vector> __detectedPlaces; + void __detectedPlacesUpdate(std::vector> &newPlaces); + void __processVisits(Visits &visits); + static void __mergeLocation(const Visits &mergedVisits, Place &place); + std::shared_ptr __mergeVisits(const std::vector &visits); + + bool onTimerExpired(int timerId); + + public: + PlacesDetector(bool testMode = false); + static void reduceOutliers(Visits &visits); // TODO: move to private + static void reduceOutliers(std::shared_ptr &cc); // TODO: move to private + std::vector> getPlaces(); + + }; /* class PlacesDetector */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_PLACES_DETECTOR_ */ diff --git a/src/my-place/user_places/prob_features_model.h b/src/my-place/user_places/prob_features_model.h new file mode 100644 index 0000000..d30f548 --- /dev/null +++ b/src/my-place/user_places/prob_features_model.h @@ -0,0 +1,30291 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_FEATURES_MODEL_H_ +#define _CONTEXT_PLACE_RECOGNITION_FEATURES_MODEL_H_ + +namespace ctx { + +namespace prob_features { + + /* + * Probabilities for whole week with minutes resolution + * from beginning of the week (sunday -> monday midnight) <0, 10080). + * Key is PlaceCategId: + * PLACE_CATEG_ID_HOME + * PLACE_CATEG_ID_WORK + * PLACE_CATEG_ID_OTHER + */ + std::map> weekModel { + { PLACE_CATEG_ID_HOME, + { + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9833333333333330, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9830508474576270, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9827586206896550, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9821428571428570, + 0.9821428571428570, + 0.9821428571428570, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770, + 0.9821428571428570, + 0.9821428571428570, + 0.9821428571428570, + 0.9821428571428570, + 0.9821428571428570, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9636363636363640, + 0.9636363636363640, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9629629629629630, + 0.9629629629629630, + 0.9629629629629630, + 0.9629629629629630, + 0.9629629629629630, + 0.9629629629629630, + 0.9454545454545450, + 0.9454545454545450, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9122807017543860, + 0.9122807017543860, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9245283018867930, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9215686274509800, + 0.9215686274509800, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8490566037735850, + 0.8490566037735850, + 0.8490566037735850, + 0.8490566037735850, + 0.8461538461538460, + 0.8461538461538460, + 0.8461538461538460, + 0.8461538461538460, + 0.8461538461538460, + 0.8461538461538460, + 0.8461538461538460, + 0.8148148148148150, + 0.8148148148148150, + 0.8148148148148150, + 0.8148148148148150, + 0.8148148148148150, + 0.8113207547169810, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7924528301886790, + 0.7924528301886790, + 0.7924528301886790, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7692307692307690, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7169811320754720, + 0.7169811320754720, + 0.7169811320754720, + 0.7115384615384620, + 0.7000000000000000, + 0.7000000000000000, + 0.6875000000000000, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6666666666666670, + 0.6400000000000000, + 0.6274509803921570, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6078431372549020, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.5882352941176470, + 0.5882352941176470, + 0.5882352941176470, + 0.5882352941176470, + 0.5882352941176470, + 0.5769230769230770, + 0.5769230769230770, + 0.5600000000000000, + 0.5490196078431370, + 0.5208333333333330, + 0.5208333333333330, + 0.5208333333333330, + 0.5208333333333330, + 0.5208333333333330, + 0.5102040816326530, + 0.4893617021276600, + 0.4893617021276600, + 0.4893617021276600, + 0.4893617021276600, + 0.4444444444444440, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4255319148936170, + 0.4130434782608700, + 0.4130434782608700, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3478260869565220, + 0.3478260869565220, + 0.3478260869565220, + 0.3478260869565220, + 0.3478260869565220, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3111111111111110, + 0.3111111111111110, + 0.2790697674418600, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2666666666666670, + 0.2666666666666670, + 0.2666666666666670, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2244897959183670, + 0.2244897959183670, + 0.2200000000000000, + 0.2156862745098040, + 0.2156862745098040, + 0.2156862745098040, + 0.2075471698113210, + 0.2075471698113210, + 0.1923076923076920, + 0.1923076923076920, + 0.1886792452830190, + 0.1886792452830190, + 0.1886792452830190, + 0.1886792452830190, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1481481481481480, + 0.1481481481481480, + 0.1428571428571430, + 0.1428571428571430, + 0.1379310344827590, + 0.1379310344827590, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1034482758620690, + 0.1034482758620690, + 0.1000000000000000, + 0.1000000000000000, + 0.0983606557377049, + 0.0983606557377049, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0677966101694915, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0833333333333333, + 0.0833333333333333, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0847457627118644, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0819672131147541, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0862068965517241, + 0.0862068965517241, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.1034482758620690, + 0.1034482758620690, + 0.1034482758620690, + 0.1052631578947370, + 0.1052631578947370, + 0.1052631578947370, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1090909090909090, + 0.1090909090909090, + 0.1111111111111110, + 0.1111111111111110, + 0.1090909090909090, + 0.1111111111111110, + 0.1090909090909090, + 0.1111111111111110, + 0.1132075471698110, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1320754716981130, + 0.1320754716981130, + 0.1346153846153850, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1481481481481480, + 0.1636363636363640, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1578947368421050, + 0.1724137931034480, + 0.1724137931034480, + 0.1754385964912280, + 0.1785714285714290, + 0.1785714285714290, + 0.1818181818181820, + 0.1851851851851850, + 0.1851851851851850, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1785714285714290, + 0.1851851851851850, + 0.1851851851851850, + 0.1818181818181820, + 0.1964285714285710, + 0.1818181818181820, + 0.1818181818181820, + 0.1964285714285710, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.2105263157894740, + 0.2142857142857140, + 0.2321428571428570, + 0.2280701754385960, + 0.2280701754385960, + 0.2321428571428570, + 0.2321428571428570, + 0.2500000000000000, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2500000000000000, + 0.2500000000000000, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2592592592592590, + 0.2545454545454540, + 0.2545454545454540, + 0.2592592592592590, + 0.2592592592592590, + 0.2592592592592590, + 0.2777777777777780, + 0.2777777777777780, + 0.2641509433962260, + 0.2692307692307690, + 0.2692307692307690, + 0.2745098039215690, + 0.2830188679245280, + 0.2884615384615380, + 0.2941176470588230, + 0.2941176470588230, + 0.2941176470588230, + 0.2884615384615380, + 0.2941176470588230, + 0.2884615384615380, + 0.2884615384615380, + 0.3000000000000000, + 0.3061224489795920, + 0.3061224489795920, + 0.3061224489795920, + 0.3061224489795920, + 0.3000000000000000, + 0.3061224489795920, + 0.3061224489795920, + 0.3061224489795920, + 0.3265306122448980, + 0.3265306122448980, + 0.3200000000000000, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3478260869565220, + 0.3695652173913040, + 0.3695652173913040, + 0.3695652173913040, + 0.4130434782608700, + 0.4130434782608700, + 0.4255319148936170, + 0.4255319148936170, + 0.4255319148936170, + 0.4489795918367350, + 0.4888888888888890, + 0.5000000000000000, + 0.5000000000000000, + 0.5000000000000000, + 0.5000000000000000, + 0.5116279069767440, + 0.5116279069767440, + 0.5116279069767440, + 0.5238095238095240, + 0.5238095238095240, + 0.5365853658536590, + 0.5365853658536590, + 0.5348837209302320, + 0.5348837209302320, + 0.5227272727272730, + 0.5348837209302320, + 0.5348837209302320, + 0.5348837209302320, + 0.5227272727272730, + 0.5227272727272730, + 0.5000000000000000, + 0.5000000000000000, + 0.5111111111111110, + 0.5111111111111110, + 0.5227272727272730, + 0.5227272727272730, + 0.4893617021276600, + 0.5000000000000000, + 0.5102040816326530, + 0.5102040816326530, + 0.5200000000000000, + 0.5306122448979590, + 0.5200000000000000, + 0.5294117647058820, + 0.5294117647058820, + 0.5294117647058820, + 0.5192307692307690, + 0.5094339622641510, + 0.5094339622641510, + 0.5094339622641510, + 0.5294117647058820, + 0.5384615384615380, + 0.5471698113207550, + 0.5471698113207550, + 0.5471698113207550, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5636363636363640, + 0.5535714285714290, + 0.5535714285714290, + 0.5535714285714290, + 0.5636363636363640, + 0.5714285714285710, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5925925925925930, + 0.5925925925925930, + 0.5925925925925930, + 0.5925925925925930, + 0.5818181818181820, + 0.5925925925925930, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6956521739130430, + 0.7111111111111110, + 0.7111111111111110, + 0.7111111111111110, + 0.7272727272727270, + 0.7272727272727270, + 0.7333333333333330, + 0.7333333333333330, + 0.7333333333333330, + 0.7333333333333330, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7826086956521740, + 0.7826086956521740, + 0.7826086956521740, + 0.7872340425531920, + 0.7872340425531920, + 0.7872340425531920, + 0.7708333333333330, + 0.7400000000000000, + 0.7400000000000000, + 0.7551020408163260, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7200000000000000, + 0.7200000000000000, + 0.7200000000000000, + 0.7058823529411760, + 0.7058823529411760, + 0.7115384615384620, + 0.7115384615384620, + 0.7115384615384620, + 0.7169811320754720, + 0.7169811320754720, + 0.7307692307692310, + 0.7307692307692310, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7600000000000000, + 0.7600000000000000, + 0.7647058823529410, + 0.7647058823529410, + 0.7500000000000000, + 0.7500000000000000, + 0.7800000000000000, + 0.7800000000000000, + 0.7692307692307690, + 0.7647058823529410, + 0.7647058823529410, + 0.7800000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8200000000000000, + 0.8200000000000000, + 0.8039215686274510, + 0.8039215686274510, + 0.8039215686274510, + 0.8039215686274510, + 0.8235294117647060, + 0.8076923076923080, + 0.7924528301886790, + 0.7924528301886790, + 0.7924528301886790, + 0.7884615384615380, + 0.8076923076923080, + 0.8076923076923080, + 0.8076923076923080, + 0.8113207547169810, + 0.8113207547169810, + 0.8148148148148150, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8148148148148150, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8333333333333330, + 0.8518518518518520, + 0.8545454545454550, + 0.8545454545454550, + 0.8571428571428570, + 0.8571428571428570, + 0.8596491228070170, + 0.8596491228070170, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8500000000000000, + 0.8500000000000000, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8793103448275860, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8620689655172410, + 0.8620689655172410, + 0.8771929824561400, + 0.8793103448275860, + 0.8813559322033900, + 0.8813559322033900, + 0.8965517241379310, + 0.8965517241379310, + 0.8965517241379310, + 0.8965517241379310, + 0.8965517241379310, + 0.8965517241379310, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8793103448275860, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.9000000000000000, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9137931034482760, + 0.9137931034482760, + 0.9137931034482760, + 0.9137931034482760, + 0.9137931034482760, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9016393442622950, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9062500000000000, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9354838709677420, + 0.9354838709677420, + 0.9354838709677420, + 0.9508196721311470, + 0.9508196721311470, + 0.9508196721311470, + 0.9508196721311470, + 0.9516129032258060, + 0.9516129032258060, + 0.9523809523809520, + 0.9523809523809520, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9836065573770490, + 0.9836065573770490, + 0.9836065573770490, + 0.9836065573770490, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9838709677419350, + 0.9841269841269840, + 0.9841269841269840, + 0.9841269841269840, + 0.9841269841269840, + 0.9841269841269840, + 0.9841269841269840, + 0.9843750000000000, + 0.9843750000000000, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9848484848484850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9846153846153850, + 0.9843750000000000, + 0.9843750000000000, + 0.9843750000000000, + 0.9843750000000000, + 0.9843750000000000, + 0.9843750000000000, + 0.9843750000000000, + 0.9843750000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 1.0000000000000000, + 0.9661016949152540, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9473684210526320, + 0.9298245614035090, + 0.9298245614035090, + 0.9298245614035090, + 0.9298245614035090, + 0.9298245614035090, + 0.9298245614035090, + 0.9298245614035090, + 0.9137931034482760, + 0.9122807017543860, + 0.9122807017543860, + 0.9122807017543860, + 0.9122807017543860, + 0.9107142857142860, + 0.9272727272727270, + 0.9107142857142860, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.8947368421052630, + 0.9107142857142860, + 0.9107142857142860, + 0.9107142857142860, + 0.9107142857142860, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8727272727272730, + 0.8888888888888890, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8490566037735850, + 0.8490566037735850, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8000000000000000, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7818181818181820, + 0.7777777777777780, + 0.7454545454545450, + 0.7454545454545450, + 0.7407407407407410, + 0.7407407407407410, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7307692307692310, + 0.7254901960784310, + 0.7254901960784310, + 0.7254901960784310, + 0.7254901960784310, + 0.7058823529411760, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.6800000000000000, + 0.6800000000000000, + 0.6666666666666670, + 0.6666666666666670, + 0.6600000000000000, + 0.6600000000000000, + 0.6600000000000000, + 0.6470588235294120, + 0.6346153846153850, + 0.6037735849056600, + 0.6037735849056600, + 0.5961538461538460, + 0.5769230769230770, + 0.5576923076923080, + 0.5576923076923080, + 0.5576923076923080, + 0.5471698113207550, + 0.5471698113207550, + 0.5471698113207550, + 0.5471698113207550, + 0.5471698113207550, + 0.5471698113207550, + 0.5294117647058820, + 0.5294117647058820, + 0.5294117647058820, + 0.5294117647058820, + 0.5200000000000000, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5200000000000000, + 0.5200000000000000, + 0.5200000000000000, + 0.5200000000000000, + 0.5200000000000000, + 0.5200000000000000, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5000000000000000, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.4509803921568630, + 0.4600000000000000, + 0.4285714285714290, + 0.4285714285714290, + 0.4285714285714290, + 0.4285714285714290, + 0.3958333333333330, + 0.3958333333333330, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3541666666666670, + 0.3333333333333330, + 0.3265306122448980, + 0.3265306122448980, + 0.3061224489795920, + 0.3000000000000000, + 0.2941176470588230, + 0.2941176470588230, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2340425531914890, + 0.2340425531914890, + 0.2391304347826090, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2045454545454550, + 0.1956521739130430, + 0.1914893617021280, + 0.1875000000000000, + 0.1632653061224490, + 0.1632653061224490, + 0.1600000000000000, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1403508771929820, + 0.1403508771929820, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1166666666666670, + 0.1166666666666670, + 0.1166666666666670, + 0.1166666666666670, + 0.1166666666666670, + 0.1166666666666670, + 0.1147540983606560, + 0.1147540983606560, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.0967741935483871, + 0.0967741935483871, + 0.1093750000000000, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0769230769230769, + 0.0769230769230769, + 0.0781250000000000, + 0.0781250000000000, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0491803278688525, + 0.0491803278688525, + 0.0500000000000000, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0476190476190476, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0468750000000000, + 0.0476190476190476, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0476190476190476, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0333333333333333, + 0.0344827586206897, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0357142857142857, + 0.0363636363636364, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0363636363636364, + 0.0370370370370370, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0317460317460317, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0937500000000000, + 0.0952380952380952, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.1000000000000000, + 0.1147540983606560, + 0.1147540983606560, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1311475409836070, + 0.1333333333333330, + 0.1355932203389830, + 0.1355932203389830, + 0.1333333333333330, + 0.1333333333333330, + 0.1290322580645160, + 0.1269841269841270, + 0.1406250000000000, + 0.1538461538461540, + 0.1538461538461540, + 0.1538461538461540, + 0.1538461538461540, + 0.1562500000000000, + 0.1538461538461540, + 0.1538461538461540, + 0.1538461538461540, + 0.1538461538461540, + 0.1562500000000000, + 0.1562500000000000, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1562500000000000, + 0.1562500000000000, + 0.1562500000000000, + 0.1562500000000000, + 0.1562500000000000, + 0.1718750000000000, + 0.1718750000000000, + 0.1718750000000000, + 0.1718750000000000, + 0.1718750000000000, + 0.1718750000000000, + 0.1718750000000000, + 0.1846153846153850, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1904761904761900, + 0.1774193548387100, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1864406779661020, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1929824561403510, + 0.2000000000000000, + 0.1964285714285710, + 0.1964285714285710, + 0.2000000000000000, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2115384615384620, + 0.2222222222222220, + 0.2222222222222220, + 0.2181818181818180, + 0.2181818181818180, + 0.2142857142857140, + 0.2142857142857140, + 0.2142857142857140, + 0.2241379310344830, + 0.2241379310344830, + 0.2280701754385960, + 0.2321428571428570, + 0.2363636363636360, + 0.2321428571428570, + 0.2321428571428570, + 0.2321428571428570, + 0.2321428571428570, + 0.2407407407407410, + 0.2592592592592590, + 0.2745098039215690, + 0.2745098039215690, + 0.2884615384615380, + 0.3000000000000000, + 0.3265306122448980, + 0.3265306122448980, + 0.3400000000000000, + 0.3400000000000000, + 0.3400000000000000, + 0.3400000000000000, + 0.3333333333333330, + 0.3333333333333330, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3541666666666670, + 0.3541666666666670, + 0.3400000000000000, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3653846153846150, + 0.3888888888888890, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4181818181818180, + 0.4181818181818180, + 0.4181818181818180, + 0.4385964912280700, + 0.4285714285714290, + 0.4285714285714290, + 0.4285714285714290, + 0.4285714285714290, + 0.4285714285714290, + 0.4464285714285710, + 0.4545454545454550, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4705882352941180, + 0.5000000000000000, + 0.5098039215686270, + 0.5098039215686270, + 0.5192307692307690, + 0.5098039215686270, + 0.5098039215686270, + 0.5098039215686270, + 0.5000000000000000, + 0.5000000000000000, + 0.4905660377358490, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.4727272727272730, + 0.4727272727272730, + 0.4727272727272730, + 0.4727272727272730, + 0.4727272727272730, + 0.4807692307692310, + 0.4807692307692310, + 0.4807692307692310, + 0.4905660377358490, + 0.5000000000000000, + 0.5000000000000000, + 0.4909090909090910, + 0.4909090909090910, + 0.5192307692307690, + 0.5370370370370370, + 0.5370370370370370, + 0.5370370370370370, + 0.5576923076923080, + 0.5576923076923080, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.6170212765957450, + 0.6304347826086960, + 0.6304347826086960, + 0.6666666666666670, + 0.6739130434782610, + 0.6808510638297870, + 0.6458333333333330, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6458333333333330, + 0.6458333333333330, + 0.6530612244897960, + 0.6666666666666670, + 0.6666666666666670, + 0.6875000000000000, + 0.6938775510204080, + 0.7083333333333330, + 0.7234042553191490, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.6938775510204080, + 0.6938775510204080, + 0.7000000000000000, + 0.7000000000000000, + 0.7058823529411760, + 0.7058823529411760, + 0.6923076923076920, + 0.6923076923076920, + 0.6981132075471700, + 0.7169811320754720, + 0.7500000000000000, + 0.7500000000000000, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7358490566037730, + 0.7407407407407410, + 0.7547169811320760, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7272727272727270, + 0.7454545454545450, + 0.7321428571428570, + 0.7321428571428570, + 0.7321428571428570, + 0.7321428571428570, + 0.7368421052631580, + 0.7368421052631580, + 0.7241379310344830, + 0.7241379310344830, + 0.7241379310344830, + 0.7241379310344830, + 0.7288135593220340, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7333333333333330, + 0.7333333333333330, + 0.7333333333333330, + 0.7213114754098360, + 0.7258064516129030, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7419354838709680, + 0.7419354838709680, + 0.7419354838709680, + 0.7666666666666670, + 0.7666666666666670, + 0.7666666666666670, + 0.7666666666666670, + 0.7666666666666670, + 0.7796610169491530, + 0.8214285714285710, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.7758620689655170, + 0.7758620689655170, + 0.7796610169491530, + 0.7833333333333330, + 0.7868852459016390, + 0.8000000000000000, + 0.7868852459016390, + 0.7868852459016390, + 0.7868852459016390, + 0.7903225806451610, + 0.7903225806451610, + 0.7903225806451610, + 0.7903225806451610, + 0.8032786885245900, + 0.8032786885245900, + 0.7903225806451610, + 0.7903225806451610, + 0.7936507936507940, + 0.7846153846153850, + 0.7846153846153850, + 0.7846153846153850, + 0.7846153846153850, + 0.7968750000000000, + 0.7968750000000000, + 0.7968750000000000, + 0.7846153846153850, + 0.7846153846153850, + 0.7846153846153850, + 0.7846153846153850, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8125000000000000, + 0.8225806451612900, + 0.8225806451612900, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8793103448275860, + 0.8793103448275860, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8906250000000000, + 0.8906250000000000, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8730158730158730, + 0.8888888888888890, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9193548387096770, + 0.9193548387096770, + 0.9193548387096770, + 0.9193548387096770, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9354838709677420, + 0.9354838709677420, + 0.9354838709677420, + 0.9354838709677420, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9354838709677420, + 0.9354838709677420, + 0.9354838709677420, + 0.9354838709677420, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9230769230769230, + 0.9230769230769230, + 0.9230769230769230, + 0.9230769230769230, + 0.9230769230769230, + 0.9230769230769230, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9242424242424240, + 0.9253731343283580, + 0.9264705882352940, + 0.9264705882352940, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9285714285714290, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9420289855072460, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9565217391304350, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9705882352941180, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9701492537313430, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9696969696969700, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9692307692307690, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9692307692307690, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9365079365079360, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9193548387096770, + 0.9193548387096770, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9333333333333330, + 0.9322033898305080, + 0.9322033898305080, + 0.9322033898305080, + 0.9322033898305080, + 0.9166666666666670, + 0.9322033898305080, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8852459016393440, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8793103448275860, + 0.8793103448275860, + 0.8793103448275860, + 0.8793103448275860, + 0.8793103448275860, + 0.8644067796610170, + 0.8666666666666670, + 0.8524590163934430, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8474576271186440, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8166666666666670, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8000000000000000, + 0.7857142857142860, + 0.7857142857142860, + 0.7857142857142860, + 0.7857142857142860, + 0.7636363636363640, + 0.7592592592592590, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7500000000000000, + 0.7450980392156860, + 0.7346938775510200, + 0.7200000000000000, + 0.7200000000000000, + 0.7058823529411760, + 0.7000000000000000, + 0.6862745098039220, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6538461538461540, + 0.6470588235294120, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6226415094339620, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.5818181818181820, + 0.5818181818181820, + 0.5818181818181820, + 0.5714285714285710, + 0.5714285714285710, + 0.5614035087719300, + 0.5517241379310340, + 0.5272727272727270, + 0.5272727272727270, + 0.5272727272727270, + 0.5272727272727270, + 0.5178571428571430, + 0.5178571428571430, + 0.4909090909090910, + 0.4821428571428570, + 0.4821428571428570, + 0.4736842105263160, + 0.4482758620689660, + 0.4482758620689660, + 0.4385964912280700, + 0.4385964912280700, + 0.4385964912280700, + 0.4385964912280700, + 0.4385964912280700, + 0.4385964912280700, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3888888888888890, + 0.3818181818181820, + 0.3818181818181820, + 0.3703703703703700, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3518518518518520, + 0.3137254901960780, + 0.2941176470588230, + 0.2800000000000000, + 0.2653061224489800, + 0.2653061224489800, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2200000000000000, + 0.2156862745098040, + 0.2156862745098040, + 0.2156862745098040, + 0.2115384615384620, + 0.2115384615384620, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.1886792452830190, + 0.1886792452830190, + 0.1886792452830190, + 0.1886792452830190, + 0.1851851851851850, + 0.1851851851851850, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1694915254237290, + 0.1694915254237290, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1612903225806450, + 0.1406250000000000, + 0.1406250000000000, + 0.1384615384615380, + 0.1384615384615380, + 0.1406250000000000, + 0.1406250000000000, + 0.1384615384615380, + 0.1384615384615380, + 0.1363636363636360, + 0.1363636363636360, + 0.1363636363636360, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1323529411764710, + 0.1304347826086960, + 0.1304347826086960, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1285714285714290, + 0.1267605633802820, + 0.1142857142857140, + 0.1142857142857140, + 0.1159420289855070, + 0.1159420289855070, + 0.1159420289855070, + 0.1029411764705880, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0869565217391304, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0857142857142857, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0735294117647059, + 0.0724637681159420, + 0.0735294117647059, + 0.0746268656716418, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0781250000000000, + 0.0769230769230769, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0769230769230769, + 0.0781250000000000, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0625000000000000, + 0.0625000000000000, + 0.0615384615384615, + 0.0615384615384615, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0645161290322581, + 0.0634920634920635, + 0.0634920634920635, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0645161290322581, + 0.0645161290322581, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0645161290322581, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0606060606060606, + 0.0579710144927536, + 0.0579710144927536, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0563380281690141, + 0.0563380281690141, + 0.0571428571428571, + 0.0579710144927536, + 0.0588235294117647, + 0.0588235294117647, + 0.0597014925373134, + 0.0606060606060606, + 0.0597014925373134, + 0.0588235294117647, + 0.0579710144927536, + 0.0571428571428571, + 0.0571428571428571, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0735294117647059, + 0.0735294117647059, + 0.0746268656716418, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0724637681159420, + 0.0724637681159420, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0704225352112676, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0684931506849315, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0694444444444444, + 0.0694444444444444, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0555555555555556, + 0.0555555555555556, + 0.0563380281690141, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0422535211267606, + 0.0428571428571429, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0428571428571429, + 0.0434782608695652, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0735294117647059, + 0.0735294117647059, + 0.0724637681159420, + 0.0735294117647059, + 0.0724637681159420, + 0.0857142857142857, + 0.0857142857142857, + 0.0985915492957746, + 0.0985915492957746, + 0.1000000000000000, + 0.1014492753623190, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1194029850746270, + 0.1194029850746270, + 0.1194029850746270, + 0.1194029850746270, + 0.1194029850746270, + 0.1194029850746270, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1470588235294120, + 0.1449275362318840, + 0.1449275362318840, + 0.1449275362318840, + 0.1470588235294120, + 0.1470588235294120, + 0.1449275362318840, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1323529411764710, + 0.1343283582089550, + 0.1212121212121210, + 0.1194029850746270, + 0.1194029850746270, + 0.1212121212121210, + 0.1194029850746270, + 0.1194029850746270, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1470588235294120, + 0.1492537313432840, + 0.1515151515151520, + 0.1515151515151520, + 0.1515151515151520, + 0.1515151515151520, + 0.1515151515151520, + 0.1538461538461540, + 0.1538461538461540, + 0.1666666666666670, + 0.1666666666666670, + 0.1791044776119400, + 0.1791044776119400, + 0.1818181818181820, + 0.1875000000000000, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1774193548387100, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1666666666666670, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1833333333333330, + 0.1833333333333330, + 0.2131147540983610, + 0.2166666666666670, + 0.2166666666666670, + 0.2131147540983610, + 0.2258064516129030, + 0.2258064516129030, + 0.2258064516129030, + 0.2258064516129030, + 0.2258064516129030, + 0.2295081967213110, + 0.2295081967213110, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2372881355932200, + 0.2456140350877190, + 0.2363636363636360, + 0.2631578947368420, + 0.2631578947368420, + 0.2586206896551720, + 0.2631578947368420, + 0.2631578947368420, + 0.2678571428571430, + 0.2727272727272730, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2909090909090910, + 0.2962962962962960, + 0.2830188679245280, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3750000000000000, + 0.3750000000000000, + 0.3750000000000000, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3877551020408160, + 0.3958333333333330, + 0.3958333333333330, + 0.4081632653061220, + 0.4038461538461540, + 0.4074074074074070, + 0.4035087719298250, + 0.3965517241379310, + 0.3965517241379310, + 0.4067796610169490, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4237288135593220, + 0.4237288135593220, + 0.4237288135593220, + 0.4310344827586210, + 0.4310344827586210, + 0.4237288135593220, + 0.4237288135593220, + 0.4237288135593220, + 0.4333333333333330, + 0.4426229508196720, + 0.4426229508196720, + 0.4516129032258060, + 0.4516129032258060, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4531250000000000, + 0.4461538461538460, + 0.4461538461538460, + 0.4285714285714290, + 0.4354838709677420, + 0.4262295081967210, + 0.4482758620689660, + 0.4482758620689660, + 0.4406779661016950, + 0.4406779661016950, + 0.4406779661016950, + 0.4576271186440680, + 0.4590163934426230, + 0.4677419354838710, + 0.4915254237288140, + 0.4915254237288140, + 0.4915254237288140, + 0.5000000000000000, + 0.5081967213114750, + 0.5081967213114750, + 0.5081967213114750, + 0.5081967213114750, + 0.5166666666666670, + 0.5166666666666670, + 0.5166666666666670, + 0.5166666666666670, + 0.5081967213114750, + 0.5081967213114750, + 0.5081967213114750, + 0.5000000000000000, + 0.5084745762711860, + 0.5084745762711860, + 0.5000000000000000, + 0.5000000000000000, + 0.5081967213114750, + 0.5161290322580650, + 0.5076923076923080, + 0.5156250000000000, + 0.5238095238095240, + 0.5238095238095240, + 0.5238095238095240, + 0.5245901639344260, + 0.5333333333333330, + 0.5245901639344260, + 0.5500000000000000, + 0.5500000000000000, + 0.5573770491803280, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5645161290322580, + 0.5625000000000000, + 0.5538461538461540, + 0.5454545454545450, + 0.5454545454545450, + 0.5454545454545450, + 0.5454545454545450, + 0.5384615384615380, + 0.5384615384615380, + 0.5384615384615380, + 0.5454545454545450, + 0.5588235294117650, + 0.5588235294117650, + 0.5671641791044780, + 0.5588235294117650, + 0.5588235294117650, + 0.5588235294117650, + 0.5757575757575760, + 0.5757575757575760, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6290322580645160, + 0.6290322580645160, + 0.6290322580645160, + 0.6393442622950820, + 0.6393442622950820, + 0.6393442622950820, + 0.6271186440677970, + 0.6271186440677970, + 0.6271186440677970, + 0.6206896551724140, + 0.6206896551724140, + 0.6206896551724140, + 0.6428571428571430, + 0.6428571428571430, + 0.6315789473684210, + 0.6428571428571430, + 0.6428571428571430, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6481481481481480, + 0.6481481481481480, + 0.6296296296296300, + 0.6296296296296300, + 0.6415094339622640, + 0.6296296296296300, + 0.6415094339622640, + 0.6226415094339620, + 0.6181818181818180, + 0.6296296296296300, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6315789473684210, + 0.6428571428571430, + 0.6545454545454550, + 0.6607142857142860, + 0.6607142857142860, + 0.6607142857142860, + 0.6724137931034480, + 0.6724137931034480, + 0.6779661016949150, + 0.6779661016949150, + 0.6833333333333330, + 0.6833333333333330, + 0.7000000000000000, + 0.7000000000000000, + 0.7166666666666670, + 0.7166666666666670, + 0.7118644067796610, + 0.7118644067796610, + 0.7241379310344830, + 0.7241379310344830, + 0.7368421052631580, + 0.7368421052631580, + 0.7368421052631580, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7166666666666670, + 0.7049180327868850, + 0.7049180327868850, + 0.7049180327868850, + 0.7049180327868850, + 0.6935483870967740, + 0.6935483870967740, + 0.6935483870967740, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.6923076923076920, + 0.6923076923076920, + 0.6969696969696970, + 0.6969696969696970, + 0.7076923076923080, + 0.7076923076923080, + 0.6969696969696970, + 0.6969696969696970, + 0.6865671641791040, + 0.6865671641791040, + 0.6865671641791040, + 0.6911764705882350, + 0.6911764705882350, + 0.6911764705882350, + 0.6911764705882350, + 0.7014925373134330, + 0.7058823529411760, + 0.7058823529411760, + 0.7164179104477610, + 0.7164179104477610, + 0.7164179104477610, + 0.7164179104477610, + 0.7164179104477610, + 0.7164179104477610, + 0.7246376811594200, + 0.7246376811594200, + 0.7352941176470590, + 0.7352941176470590, + 0.7352941176470590, + 0.7352941176470590, + 0.7352941176470590, + 0.7352941176470590, + 0.7352941176470590, + 0.7462686567164180, + 0.7462686567164180, + 0.7575757575757580, + 0.7611940298507460, + 0.7611940298507460, + 0.7647058823529410, + 0.7681159420289850, + 0.7681159420289850, + 0.7681159420289850, + 0.7681159420289850, + 0.7681159420289850, + 0.7681159420289850, + 0.7826086956521740, + 0.7941176470588230, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8059701492537310, + 0.8181818181818180, + 0.8307692307692310, + 0.8307692307692310, + 0.8437500000000000, + 0.8437500000000000, + 0.8437500000000000, + 0.8461538461538460, + 0.8461538461538460, + 0.8484848484848480, + 0.8484848484848480, + 0.8484848484848480, + 0.8484848484848480, + 0.8507462686567160, + 0.8571428571428570, + 0.8571428571428570, + 0.8695652173913040, + 0.8695652173913040, + 0.8695652173913040, + 0.8695652173913040, + 0.8695652173913040, + 0.8695652173913040, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8656716417910450, + 0.8636363636363640, + 0.8636363636363640, + 0.8636363636363640, + 0.8636363636363640, + 0.8636363636363640, + 0.8636363636363640, + 0.8656716417910450, + 0.8656716417910450, + 0.8695652173913040, + 0.8695652173913040, + 0.8695652173913040, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8636363636363640, + 0.8636363636363640, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8769230769230770, + 0.8906250000000000, + 0.8906250000000000, + 0.8906250000000000, + 0.8923076923076920, + 0.8923076923076920, + 0.8923076923076920, + 0.8923076923076920, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.9000000000000000, + 0.9000000000000000, + 0.9014084507042250, + 0.9014084507042250, + 0.9014084507042250, + 0.9014084507042250, + 0.9014084507042250, + 0.9014084507042250, + 0.9014084507042250, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9305555555555560, + 0.9305555555555560, + 0.9305555555555560, + 0.9305555555555560, + 0.9305555555555560, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9315068493150680, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9324324324324320, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9459459459459460, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9452054794520550, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9444444444444440, + 0.9577464788732390, + 0.9577464788732390, + 0.9577464788732390, + 0.9577464788732390, + 0.9577464788732390, + 0.9577464788732390, + 0.9577464788732390, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9571428571428570, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9558823529411760, + 0.9545454545454550, + 0.9545454545454550, + 0.9545454545454550, + 0.9545454545454550, + 0.9538461538461540, + 0.9538461538461540, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9672131147540980, + 0.9672131147540980, + 0.9672131147540980, + 0.9672131147540980, + 0.9672131147540980, + 0.9672131147540980, + 0.9666666666666670, + 0.9661016949152540, + 0.9661016949152540, + 0.9655172413793100, + 0.9655172413793100, + 0.9655172413793100, + 0.9491525423728810, + 0.9491525423728810, + 0.9491525423728810, + 0.9333333333333330, + 0.9333333333333330, + 0.9322033898305080, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9137931034482760, + 0.9137931034482760, + 0.9137931034482760, + 0.8983050847457630, + 0.8983050847457630, + 0.8965517241379310, + 0.8813559322033900, + 0.8813559322033900, + 0.8793103448275860, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8474576271186440, + 0.8474576271186440, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.7868852459016390, + 0.7868852459016390, + 0.7868852459016390, + 0.7833333333333330, + 0.7833333333333330, + 0.7833333333333330, + 0.7833333333333330, + 0.7704918032786880, + 0.7704918032786880, + 0.7704918032786880, + 0.7704918032786880, + 0.7704918032786880, + 0.7580645161290320, + 0.7540983606557380, + 0.7419354838709680, + 0.7377049180327870, + 0.7377049180327870, + 0.7288135593220340, + 0.7118644067796610, + 0.7118644067796610, + 0.7068965517241380, + 0.7068965517241380, + 0.7017543859649120, + 0.6964285714285710, + 0.6964285714285710, + 0.6842105263157900, + 0.6842105263157900, + 0.6842105263157900, + 0.6842105263157900, + 0.6785714285714290, + 0.6785714285714290, + 0.6785714285714290, + 0.6785714285714290, + 0.6785714285714290, + 0.6666666666666670, + 0.6551724137931030, + 0.6379310344827590, + 0.6271186440677970, + 0.6206896551724140, + 0.5964912280701750, + 0.5964912280701750, + 0.5789473684210530, + 0.5689655172413790, + 0.5689655172413790, + 0.5689655172413790, + 0.5689655172413790, + 0.5689655172413790, + 0.5593220338983050, + 0.5593220338983050, + 0.5593220338983050, + 0.5593220338983050, + 0.5500000000000000, + 0.5423728813559320, + 0.5333333333333330, + 0.5333333333333330, + 0.5333333333333330, + 0.5333333333333330, + 0.5333333333333330, + 0.5333333333333330, + 0.5333333333333330, + 0.5333333333333330, + 0.5423728813559320, + 0.5423728813559320, + 0.5333333333333330, + 0.5166666666666670, + 0.5333333333333330, + 0.5254237288135590, + 0.5254237288135590, + 0.5254237288135590, + 0.5333333333333330, + 0.5245901639344260, + 0.5081967213114750, + 0.4736842105263160, + 0.4655172413793100, + 0.4576271186440680, + 0.4482758620689660, + 0.4406779661016950, + 0.4406779661016950, + 0.4310344827586210, + 0.4310344827586210, + 0.4310344827586210, + 0.4310344827586210, + 0.4137931034482760, + 0.4137931034482760, + 0.3818181818181820, + 0.3818181818181820, + 0.3396226415094340, + 0.3333333333333330, + 0.3272727272727270, + 0.3272727272727270, + 0.3148148148148150, + 0.3148148148148150, + 0.3148148148148150, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.2962962962962960, + 0.2962962962962960, + 0.2830188679245280, + 0.2549019607843140, + 0.2600000000000000, + 0.2448979591836730, + 0.2400000000000000, + 0.2400000000000000, + 0.2307692307692310, + 0.2307692307692310, + 0.2307692307692310, + 0.2264150943396230, + 0.2068965517241380, + 0.2068965517241380, + 0.2068965517241380, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1864406779661020, + 0.1864406779661020, + 0.1774193548387100, + 0.1774193548387100, + 0.1774193548387100, + 0.1639344262295080, + 0.1451612903225810, + 0.1451612903225810, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1230769230769230, + 0.1230769230769230, + 0.1230769230769230, + 0.1230769230769230, + 0.1230769230769230, + 0.1212121212121210, + 0.1212121212121210, + 0.1212121212121210, + 0.1176470588235290, + 0.1176470588235290, + 0.1176470588235290, + 0.1176470588235290, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1044776119402990, + 0.1029411764705880, + 0.1044776119402990, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0597014925373134, + 0.0606060606060606, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0606060606060606, + 0.0606060606060606, + 0.0746268656716418, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0746268656716418, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0869565217391304, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1029411764705880, + 0.0909090909090909, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0937500000000000, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1029411764705880, + 0.1029411764705880, + 0.0895522388059701, + 0.0909090909090909, + 0.0909090909090909, + 0.0923076923076923, + 0.0909090909090909, + 0.0909090909090909, + 0.0923076923076923, + 0.0952380952380952, + 0.0952380952380952, + 0.0967741935483871, + 0.1000000000000000, + 0.1000000000000000, + 0.1016949152542370, + 0.0967741935483871, + 0.0833333333333333, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0952380952380952, + 0.0952380952380952, + 0.1111111111111110, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1076923076923080, + 0.1093750000000000, + 0.1111111111111110, + 0.1093750000000000, + 0.1111111111111110, + 0.1111111111111110, + 0.0967741935483871, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0967741935483871, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0983606557377049, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0862068965517241, + 0.0862068965517241, + 0.0833333333333333, + 0.0833333333333333, + 0.0806451612903226, + 0.0819672131147541, + 0.0793650793650794, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0793650793650794, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0833333333333333, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0757575757575758, + 0.0757575757575758, + 0.0769230769230769, + 0.0769230769230769, + 0.0781250000000000, + 0.0781250000000000, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0952380952380952, + 0.0967741935483871, + 0.0983606557377049, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1016949152542370, + 0.1016949152542370, + 0.1186440677966100, + 0.1147540983606560, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1269841269841270, + 0.1269841269841270, + 0.1290322580645160, + 0.1290322580645160, + 0.1269841269841270, + 0.1290322580645160, + 0.1290322580645160, + 0.1311475409836070, + 0.1311475409836070, + 0.1290322580645160, + 0.1311475409836070, + 0.1451612903225810, + 0.1333333333333330, + 0.1311475409836070, + 0.1475409836065570, + 0.1475409836065570, + 0.1500000000000000, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1774193548387100, + 0.1904761904761900, + 0.1935483870967740, + 0.1967213114754100, + 0.1967213114754100, + 0.1833333333333330, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1896551724137930, + 0.2033898305084750, + 0.2000000000000000, + 0.1967213114754100, + 0.1833333333333330, + 0.1833333333333330, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1724137931034480, + 0.1864406779661020, + 0.1896551724137930, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1694915254237290, + 0.1833333333333330, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1833333333333330, + 0.1833333333333330, + 0.1864406779661020, + 0.1864406779661020, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.2105263157894740, + 0.2068965517241380, + 0.2068965517241380, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2280701754385960, + 0.2280701754385960, + 0.2321428571428570, + 0.2321428571428570, + 0.2321428571428570, + 0.2280701754385960, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2280701754385960, + 0.2000000000000000, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1964285714285710, + 0.2241379310344830, + 0.2280701754385960, + 0.2280701754385960, + 0.2321428571428570, + 0.2407407407407410, + 0.2407407407407410, + 0.2407407407407410, + 0.2363636363636360, + 0.2363636363636360, + 0.2363636363636360, + 0.2363636363636360, + 0.2363636363636360, + 0.2363636363636360, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2307692307692310, + 0.2307692307692310, + 0.2352941176470590, + 0.2352941176470590, + 0.2400000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2884615384615380, + 0.2884615384615380, + 0.2884615384615380, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2982456140350880, + 0.2982456140350880, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3148148148148150, + 0.3396226415094340, + 0.3396226415094340, + 0.3461538461538460, + 0.3461538461538460, + 0.3461538461538460, + 0.3529411764705880, + 0.3529411764705880, + 0.3584905660377360, + 0.3888888888888890, + 0.3888888888888890, + 0.3962264150943400, + 0.3888888888888890, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.4038461538461540, + 0.4117647058823530, + 0.4117647058823530, + 0.4117647058823530, + 0.4285714285714290, + 0.4285714285714290, + 0.4200000000000000, + 0.4117647058823530, + 0.4230769230769230, + 0.4117647058823530, + 0.4200000000000000, + 0.4200000000000000, + 0.4200000000000000, + 0.4200000000000000, + 0.4313725490196080, + 0.4230769230769230, + 0.4400000000000000, + 0.4400000000000000, + 0.4400000000000000, + 0.4509803921568630, + 0.4615384615384620, + 0.4615384615384620, + 0.4807692307692310, + 0.4807692307692310, + 0.4901960784313730, + 0.4901960784313730, + 0.5098039215686270, + 0.5098039215686270, + 0.5000000000000000, + 0.5192307692307690, + 0.5294117647058820, + 0.5490196078431370, + 0.5490196078431370, + 0.5600000000000000, + 0.5576923076923080, + 0.5686274509803920, + 0.5800000000000000, + 0.5800000000000000, + 0.5882352941176470, + 0.6000000000000000, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6226415094339620, + 0.6296296296296300, + 0.6296296296296300, + 0.6415094339622640, + 0.6481481481481480, + 0.6415094339622640, + 0.6415094339622640, + 0.6538461538461540, + 0.6538461538461540, + 0.6603773584905660, + 0.6603773584905660, + 0.6666666666666670, + 0.6800000000000000, + 0.6730769230769230, + 0.6666666666666670, + 0.6923076923076920, + 0.6923076923076920, + 0.6792452830188680, + 0.6923076923076920, + 0.6981132075471700, + 0.6981132075471700, + 0.6981132075471700, + 0.6981132075471700, + 0.6981132075471700, + 0.7115384615384620, + 0.7115384615384620, + 0.7254901960784310, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7222222222222220, + 0.7222222222222220, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7090909090909090, + 0.7222222222222220, + 0.7222222222222220, + 0.7017543859649120, + 0.7017543859649120, + 0.6779661016949150, + 0.6885245901639340, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7142857142857140, + 0.7142857142857140, + 0.7096774193548390, + 0.7096774193548390, + 0.6984126984126980, + 0.6885245901639340, + 0.6885245901639340, + 0.6885245901639340, + 0.7000000000000000, + 0.6774193548387100, + 0.6774193548387100, + 0.6774193548387100, + 0.6774193548387100, + 0.6721311475409840, + 0.6557377049180330, + 0.6557377049180330, + 0.6666666666666670, + 0.6779661016949150, + 0.6779661016949150, + 0.6779661016949150, + 0.6779661016949150, + 0.6779661016949150, + 0.7272727272727270, + 0.7017543859649120, + 0.7017543859649120, + 0.7068965517241380, + 0.7068965517241380, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7321428571428570, + 0.7368421052631580, + 0.7368421052631580, + 0.7368421052631580, + 0.7543859649122810, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7857142857142860, + 0.7857142857142860, + 0.7857142857142860, + 0.7894736842105260, + 0.7931034482758620, + 0.7931034482758620, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.7833333333333330, + 0.7833333333333330, + 0.7833333333333330, + 0.7833333333333330, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7868852459016390, + 0.7868852459016390, + 0.7868852459016390, + 0.7741935483870970, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7903225806451610, + 0.7903225806451610, + 0.7903225806451610, + 0.7903225806451610, + 0.7903225806451610, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8032786885245900, + 0.8032786885245900, + 0.8032786885245900, + 0.8095238095238100, + 0.8095238095238100, + 0.8095238095238100, + 0.8095238095238100, + 0.8095238095238100, + 0.8095238095238100, + 0.8032786885245900, + 0.8064516129032260, + 0.8064516129032260, + 0.8064516129032260, + 0.8064516129032260, + 0.8064516129032260, + 0.8064516129032260, + 0.8064516129032260, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8166666666666670, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8196721311475410, + 0.8166666666666670, + 0.8196721311475410, + 0.8196721311475410, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8666666666666670, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8709677419354840, + 0.8709677419354840, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8833333333333330, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8906250000000000, + 0.8906250000000000, + 0.8923076923076920, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8939393939393940, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.8955223880597010, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.9016393442622950, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.8852459016393440, + 0.8833333333333330, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8596491228070170, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8070175438596490, + 0.8070175438596490, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.8000000000000000, + 0.7962962962962960, + 0.7924528301886790, + 0.7884615384615380, + 0.7843137254901960, + 0.7843137254901960, + 0.7692307692307690, + 0.7692307692307690, + 0.7692307692307690, + 0.7547169811320760, + 0.7547169811320760, + 0.7407407407407410, + 0.7407407407407410, + 0.7272727272727270, + 0.7222222222222220, + 0.6842105263157900, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6724137931034480, + 0.6607142857142860, + 0.6545454545454550, + 0.6481481481481480, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6603773584905660, + 0.6481481481481480, + 0.6481481481481480, + 0.6481481481481480, + 0.6481481481481480, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6181818181818180, + 0.6181818181818180, + 0.6111111111111110, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.5925925925925930, + 0.5925925925925930, + 0.5925925925925930, + 0.5849056603773580, + 0.5740740740740740, + 0.5740740740740740, + 0.5660377358490570, + 0.5660377358490570, + 0.5555555555555560, + 0.5471698113207550, + 0.5370370370370370, + 0.5370370370370370, + 0.5370370370370370, + 0.5370370370370370, + 0.5370370370370370, + 0.5272727272727270, + 0.5272727272727270, + 0.5000000000000000, + 0.5000000000000000, + 0.5000000000000000, + 0.5000000000000000, + 0.4905660377358490, + 0.4905660377358490, + 0.4905660377358490, + 0.4905660377358490, + 0.4814814814814810, + 0.4905660377358490, + 0.4807692307692310, + 0.4807692307692310, + 0.4807692307692310, + 0.4807692307692310, + 0.4705882352941180, + 0.4615384615384620, + 0.4509803921568630, + 0.4509803921568630, + 0.4509803921568630, + 0.4509803921568630, + 0.4489795918367350, + 0.4489795918367350, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4255319148936170, + 0.4347826086956520, + 0.4347826086956520, + 0.4222222222222220, + 0.4222222222222220, + 0.4130434782608700, + 0.4130434782608700, + 0.4130434782608700, + 0.4000000000000000, + 0.3720930232558140, + 0.3720930232558140, + 0.3636363636363640, + 0.3555555555555560, + 0.3478260869565220, + 0.3404255319148940, + 0.3111111111111110, + 0.3111111111111110, + 0.2954545454545450, + 0.2888888888888890, + 0.2888888888888890, + 0.2888888888888890, + 0.2708333333333330, + 0.2708333333333330, + 0.2553191489361700, + 0.2553191489361700, + 0.2553191489361700, + 0.2553191489361700, + 0.2553191489361700, + 0.2553191489361700, + 0.2553191489361700, + 0.2391304347826090, + 0.2391304347826090, + 0.2444444444444440, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2200000000000000, + 0.2040816326530610, + 0.1960784313725490, + 0.1960784313725490, + 0.1960784313725490, + 0.1923076923076920, + 0.1923076923076920, + 0.1923076923076920, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1818181818181820, + 0.1666666666666670, + 0.1666666666666670, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1578947368421050, + 0.1403508771929820, + 0.1403508771929820, + 0.1379310344827590, + 0.1379310344827590, + 0.1355932203389830, + 0.1355932203389830, + 0.1355932203389830, + 0.1355932203389830, + 0.1355932203389830, + 0.1355932203389830, + 0.1379310344827590, + 0.1379310344827590, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1206896551724140, + 0.1206896551724140, + 0.1206896551724140, + 0.1206896551724140, + 0.1052631578947370, + 0.1071428571428570, + 0.1052631578947370, + 0.1052631578947370, + 0.1052631578947370, + 0.1052631578947370, + 0.1052631578947370, + 0.1052631578947370, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0727272727272727, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0740740740740741, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0784313725490196, + 0.0784313725490196, + 0.0769230769230769, + 0.0769230769230769, + 0.0784313725490196, + 0.0784313725490196, + 0.0754716981132075, + 0.0754716981132075, + 0.0740740740740741, + 0.0740740740740741, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0892857142857143, + 0.0909090909090909, + 0.0909090909090909, + 0.0877192982456140, + 0.0877192982456140, + 0.0892857142857143, + 0.0892857142857143, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0526315789473684, + 0.0517241379310345, + 0.0517241379310345, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0847457627118644, + 0.0847457627118644, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0714285714285714, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0740740740740741, + 0.0754716981132075, + 0.0754716981132075, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0754716981132075, + 0.0754716981132075, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0754716981132075, + 0.0754716981132075, + 0.0769230769230769, + 0.0769230769230769, + 0.0784313725490196, + 0.0800000000000000, + 0.0800000000000000, + 0.0816326530612245, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.1000000000000000, + 0.1020408163265310, + 0.1041666666666670, + 0.1224489795918370, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1538461538461540, + 0.1698113207547170, + 0.1698113207547170, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1346153846153850, + 0.1509433962264150, + 0.1509433962264150, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1481481481481480, + 0.1481481481481480, + 0.1636363636363640, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1896551724137930, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2307692307692310, + 0.2307692307692310, + 0.2352941176470590, + 0.2307692307692310, + 0.2307692307692310, + 0.2307692307692310, + 0.2307692307692310, + 0.2307692307692310, + 0.2307692307692310, + 0.2307692307692310, + 0.2352941176470590, + 0.2352941176470590, + 0.2352941176470590, + 0.2500000000000000, + 0.2549019607843140, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2800000000000000, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2916666666666670, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2916666666666670, + 0.3000000000000000, + 0.3000000000000000, + 0.3137254901960780, + 0.3137254901960780, + 0.3200000000000000, + 0.3200000000000000, + 0.3061224489795920, + 0.3061224489795920, + 0.3061224489795920, + 0.3125000000000000, + 0.3125000000000000, + 0.3125000000000000, + 0.3061224489795920, + 0.3333333333333330, + 0.3333333333333330, + 0.3269230769230770, + 0.3269230769230770, + 0.3269230769230770, + 0.3269230769230770, + 0.3541666666666670, + 0.3541666666666670, + 0.3617021276595740, + 0.3750000000000000, + 0.3829787234042550, + 0.3913043478260870, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3913043478260870, + 0.3913043478260870, + 0.4042553191489360, + 0.4130434782608700, + 0.4318181818181820, + 0.4444444444444440, + 0.4545454545454550, + 0.4545454545454550, + 0.4761904761904760, + 0.4651162790697670, + 0.4545454545454550, + 0.4545454545454550, + 0.4651162790697670, + 0.4545454545454550, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4545454545454550, + 0.4418604651162790, + 0.4523809523809520, + 0.4523809523809520, + 0.4878048780487810, + 0.4878048780487810, + 0.5000000000000000, + 0.5000000000000000, + 0.5116279069767440, + 0.5116279069767440, + 0.5227272727272730, + 0.5227272727272730, + 0.5348837209302320, + 0.5348837209302320, + 0.5348837209302320, + 0.5348837209302320, + 0.5348837209302320, + 0.5476190476190480, + 0.5348837209302320, + 0.5348837209302320, + 0.5476190476190480, + 0.5476190476190480, + 0.5454545454545450, + 0.5714285714285710, + 0.5909090909090910, + 0.5777777777777780, + 0.6000000000000000, + 0.6000000000000000, + 0.6170212765957450, + 0.6304347826086960, + 0.6250000000000000, + 0.6250000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.5882352941176470, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6078431372549020, + 0.5961538461538460, + 0.5961538461538460, + 0.5961538461538460, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.6037735849056600, + 0.6153846153846150, + 0.6274509803921570, + 0.6274509803921570, + 0.6274509803921570, + 0.6274509803921570, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6326530612244900, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6530612244897960, + 0.6530612244897960, + 0.6600000000000000, + 0.6734693877551020, + 0.6734693877551020, + 0.6734693877551020, + 0.6734693877551020, + 0.6666666666666670, + 0.6666666666666670, + 0.6734693877551020, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.7021276595744680, + 0.7021276595744680, + 0.7021276595744680, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7021276595744680, + 0.7021276595744680, + 0.7021276595744680, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.6600000000000000, + 0.6470588235294120, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6603773584905660, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6603773584905660, + 0.6603773584905660, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7058823529411760, + 0.7058823529411760, + 0.7200000000000000, + 0.7200000000000000, + 0.7200000000000000, + 0.7254901960784310, + 0.7254901960784310, + 0.7254901960784310, + 0.7254901960784310, + 0.7254901960784310, + 0.7307692307692310, + 0.7307692307692310, + 0.7307692307692310, + 0.7307692307692310, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7272727272727270, + 0.7142857142857140, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7090909090909090, + 0.6964285714285710, + 0.6964285714285710, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7222222222222220, + 0.7222222222222220, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7307692307692310, + 0.7450980392156860, + 0.7450980392156860, + 0.7600000000000000, + 0.7600000000000000, + 0.7647058823529410, + 0.7647058823529410, + 0.7358490566037730, + 0.7407407407407410, + 0.7407407407407410, + 0.7407407407407410, + 0.7407407407407410, + 0.7547169811320760, + 0.7647058823529410, + 0.7647058823529410, + 0.7647058823529410, + 0.7647058823529410, + 0.7647058823529410, + 0.7647058823529410, + 0.7547169811320760, + 0.7547169811320760, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7777777777777780, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.8070175438596490, + 0.8070175438596490, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8518518518518520, + 0.8518518518518520, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8867924528301890, + 0.8867924528301890, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8909090909090910, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8867924528301890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8679245283018870, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8653846153846150, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8800000000000000, + 0.8800000000000000, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8775510204081630, + 0.8958333333333330, + 0.8958333333333330, + 0.8958333333333330, + 0.8958333333333330, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8800000000000000, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.8800000000000000, + 0.8627450980392160, + 0.8571428571428570, + 0.8541666666666670, + 0.8541666666666670, + 0.8510638297872340, + 0.8478260869565220, + 0.8478260869565220, + 0.8478260869565220, + 0.8297872340425530, + 0.8125000000000000, + 0.7959183673469390, + 0.7916666666666670, + 0.7916666666666670, + 0.7916666666666670, + 0.7916666666666670, + 0.7916666666666670, + 0.7872340425531920, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7659574468085110, + 0.7659574468085110, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7446808510638300, + 0.7446808510638300, + 0.7391304347826090, + 0.7391304347826090, + 0.7555555555555560, + 0.7727272727272730, + 0.7906976744186050, + 0.7954545454545450, + 0.7954545454545450, + 0.7954545454545450, + 0.7954545454545450, + 0.7954545454545450, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7608695652173910, + 0.7608695652173910, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7446808510638300, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7446808510638300, + 0.7446808510638300, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7608695652173910, + 0.7446808510638300, + 0.7446808510638300, + 0.7446808510638300, + 0.7555555555555560, + 0.7608695652173910, + 0.7659574468085110, + 0.7659574468085110, + 0.7500000000000000, + 0.7500000000000000, + 0.7346938775510200, + 0.7291666666666670, + 0.7234042553191490, + 0.7291666666666670, + 0.7142857142857140, + 0.7142857142857140, + 0.7446808510638300, + 0.7446808510638300, + 0.7391304347826090, + 0.7391304347826090, + 0.7391304347826090, + 0.7391304347826090, + 0.6938775510204080, + 0.7021276595744680, + 0.7021276595744680, + 0.7021276595744680, + 0.7021276595744680, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.7111111111111110, + 0.7173913043478260, + 0.7111111111111110, + 0.7272727272727270, + 0.7272727272727270, + 0.7209302325581400, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6808510638297870, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6808510638297870, + 0.6666666666666670, + 0.6666666666666670, + 0.6734693877551020, + 0.6666666666666670, + 0.6530612244897960, + 0.6400000000000000, + 0.6400000000000000, + 0.6530612244897960, + 0.6666666666666670, + 0.6666666666666670, + 0.6734693877551020, + 0.6938775510204080, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.6862745098039220, + 0.6862745098039220, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7083333333333330, + 0.7021276595744680, + 0.7021276595744680, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.7021276595744680, + 0.7083333333333330, + 0.7083333333333330, + 0.6938775510204080, + 0.6938775510204080, + 0.7083333333333330, + 0.6938775510204080, + 0.7000000000000000, + 0.7000000000000000, + 0.6862745098039220, + 0.6730769230769230, + 0.6666666666666670, + 0.6730769230769230, + 0.6730769230769230, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6792452830188680, + 0.6730769230769230, + 0.6730769230769230, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6545454545454550, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6603773584905660, + 0.6603773584905660, + 0.6603773584905660, + 0.6603773584905660, + 0.6603773584905660, + 0.6538461538461540, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6481481481481480, + 0.6481481481481480, + 0.6481481481481480, + 0.6603773584905660, + 0.6730769230769230, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6730769230769230, + 0.6730769230769230, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6800000000000000, + 0.6938775510204080, + 0.6800000000000000, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6730769230769230, + 0.6666666666666670, + 0.6666666666666670, + 0.6600000000000000, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6600000000000000, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6530612244897960, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6326530612244900, + 0.6200000000000000, + 0.6200000000000000, + 0.6200000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.6041666666666670, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5869565217391300, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5833333333333330, + 0.5625000000000000, + 0.5625000000000000, + 0.5625000000000000, + 0.5625000000000000, + 0.5625000000000000, + 0.5625000000000000, + 0.5531914893617020, + 0.5531914893617020, + 0.5531914893617020, + 0.5652173913043480, + 0.5652173913043480, + 0.5652173913043480, + 0.5652173913043480, + 0.5652173913043480, + 0.5434782608695650, + 0.5434782608695650, + 0.5434782608695650, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5652173913043480, + 0.5652173913043480, + 0.5652173913043480, + 0.5744680851063830, + 0.5744680851063830, + 0.5744680851063830, + 0.5744680851063830, + 0.5744680851063830, + 0.5869565217391300, + 0.5869565217391300, + 0.5744680851063830, + 0.5744680851063830, + 0.5744680851063830, + 0.5744680851063830, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5833333333333330, + 0.5833333333333330, + 0.5714285714285710, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5800000000000000, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.5918367346938780, + 0.6000000000000000, + 0.5882352941176470, + 0.5961538461538460, + 0.5849056603773580, + 0.5925925925925930, + 0.5925925925925930, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5961538461538460, + 0.6037735849056600, + 0.5961538461538460, + 0.5961538461538460, + 0.5961538461538460, + 0.5961538461538460, + 0.5961538461538460, + 0.6122448979591840, + 0.6078431372549020, + 0.6078431372549020, + 0.6200000000000000, + 0.6200000000000000, + 0.6200000000000000, + 0.6200000000000000, + 0.6274509803921570, + 0.6274509803921570, + 0.6274509803921570, + 0.6274509803921570, + 0.6153846153846150, + 0.6037735849056600, + 0.5961538461538460, + 0.5961538461538460, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5818181818181820, + 0.5818181818181820, + 0.5818181818181820, + 0.5818181818181820, + 0.5818181818181820, + 0.5925925925925930, + 0.6037735849056600, + 0.6037735849056600, + 0.6037735849056600, + 0.5925925925925930, + 0.5925925925925930, + 0.5925925925925930, + 0.6000000000000000, + 0.5892857142857140, + 0.5892857142857140, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6071428571428570, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6296296296296300, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6111111111111110, + 0.6037735849056600, + 0.5925925925925930, + 0.5925925925925930, + 0.6000000000000000, + 0.6000000000000000, + 0.6111111111111110, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6037735849056600, + 0.6037735849056600, + 0.6037735849056600, + 0.5925925925925930, + 0.6000000000000000, + 0.6037735849056600, + 0.6153846153846150, + 0.6153846153846150, + 0.6274509803921570, + 0.6274509803921570, + 0.6346153846153850, + 0.6346153846153850, + 0.6226415094339620, + 0.6226415094339620, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6415094339622640, + 0.6226415094339620, + 0.6226415094339620, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6481481481481480, + 0.6481481481481480, + 0.6481481481481480, + 0.6481481481481480, + 0.6415094339622640, + 0.6415094339622640, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6481481481481480, + 0.6545454545454550, + 0.6545454545454550, + 0.6428571428571430, + 0.6428571428571430, + 0.6428571428571430, + 0.6428571428571430, + 0.6491228070175440, + 0.6491228070175440, + 0.6491228070175440, + 0.6491228070175440, + 0.6607142857142860, + 0.6666666666666670, + 0.6603773584905660, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6470588235294120, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6470588235294120, + 0.6470588235294120, + 0.6734693877551020, + 0.6734693877551020, + 0.6734693877551020, + 0.6734693877551020, + 0.6734693877551020, + 0.6666666666666670, + 0.6734693877551020, + 0.6734693877551020, + 0.6734693877551020, + 0.6666666666666670, + 0.6666666666666670, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6458333333333330, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6200000000000000, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6400000000000000, + 0.6400000000000000, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6346153846153850, + 0.6346153846153850, + 0.6200000000000000, + 0.6200000000000000, + 0.6200000000000000, + 0.6200000000000000, + 0.6200000000000000, + 0.6326530612244900, + 0.6530612244897960, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6530612244897960, + 0.6600000000000000, + 0.6600000000000000, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6470588235294120, + 0.6400000000000000, + 0.6400000000000000, + 0.6530612244897960, + 0.6530612244897960, + 0.6666666666666670, + 0.6666666666666670, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6530612244897960, + 0.6400000000000000, + 0.6274509803921570, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6153846153846150, + 0.6037735849056600, + 0.6037735849056600, + 0.5961538461538460, + 0.6037735849056600, + 0.6037735849056600, + 0.6037735849056600, + 0.6037735849056600, + 0.5961538461538460, + 0.5740740740740740, + 0.5740740740740740, + 0.5740740740740740, + 0.5740740740740740, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.5849056603773580, + 0.6000000000000000, + 0.6181818181818180, + 0.6181818181818180, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6037735849056600, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6111111111111110, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.6226415094339620, + 0.6226415094339620, + 0.6037735849056600, + 0.6037735849056600, + 0.6111111111111110, + 0.6181818181818180, + 0.6071428571428570, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5862068965517240, + 0.5862068965517240, + 0.6000000000000000, + 0.6000000000000000, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5789473684210530, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5789473684210530, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.5892857142857140, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6111111111111110, + 0.6181818181818180, + 0.6181818181818180, + 0.6415094339622640, + 0.6415094339622640, + 0.6538461538461540, + 0.6538461538461540, + 0.6862745098039220, + 0.7000000000000000, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.6862745098039220, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7000000000000000, + 0.7200000000000000, + 0.7346938775510200, + 0.6923076923076920, + 0.6923076923076920, + 0.6923076923076920, + 0.6923076923076920, + 0.7058823529411760, + 0.7058823529411760, + 0.7058823529411760, + 0.7058823529411760, + 0.7058823529411760, + 0.7058823529411760, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6909090909090910, + 0.6909090909090910, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7090909090909090, + 0.7222222222222220, + 0.7358490566037730, + 0.7222222222222220, + 0.7222222222222220, + 0.7272727272727270, + 0.7142857142857140, + 0.7192982456140350, + 0.7241379310344830, + 0.7241379310344830, + 0.7241379310344830, + 0.7241379310344830, + 0.7241379310344830, + 0.7368421052631580, + 0.7368421052631580, + 0.7368421052631580, + 0.7413793103448280, + 0.7543859649122810, + 0.7543859649122810, + 0.7543859649122810, + 0.7543859649122810, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7719298245614030, + 0.7719298245614030, + 0.7758620689655170, + 0.7758620689655170, + 0.7758620689655170, + 0.7758620689655170, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7857142857142860, + 0.7857142857142860, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8070175438596490, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8035714285714290, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8103448275862070, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8363636363636360, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8269230769230770, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8400000000000000, + 0.8400000000000000, + 0.8400000000000000, + 0.8400000000000000, + 0.8400000000000000, + 0.8400000000000000, + 0.8431372549019610, + 0.8431372549019610, + 0.8431372549019610, + 0.8431372549019610, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8775510204081630, + 0.8775510204081630, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8936170212765960, + 0.8936170212765960, + 0.8936170212765960, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8222222222222220, + 0.8043478260869560, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7755102040816330, + 0.7755102040816330, + 0.7755102040816330, + 0.7755102040816330, + 0.7755102040816330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7551020408163260, + 0.7551020408163260, + 0.7551020408163260, + 0.7551020408163260, + 0.7551020408163260, + 0.7551020408163260, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7346938775510200, + 0.7346938775510200, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7234042553191490, + 0.7083333333333330, + 0.7021276595744680, + 0.6875000000000000, + 0.6734693877551020, + 0.6734693877551020, + 0.6666666666666670, + 0.6808510638297870, + 0.6808510638297870, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6666666666666670, + 0.6818181818181820, + 0.6818181818181820, + 0.6818181818181820, + 0.6818181818181820, + 0.6666666666666670, + 0.6739130434782610, + 0.6956521739130430, + 0.6956521739130430, + 0.7045454545454550, + 0.7045454545454550, + 0.7045454545454550, + 0.7209302325581400, + 0.7333333333333330, + 0.7333333333333330, + 0.7173913043478260, + 0.7173913043478260, + 0.7111111111111110, + 0.7111111111111110, + 0.7272727272727270, + 0.7441860465116280, + 0.7441860465116280, + 0.7441860465116280, + 0.7500000000000000, + 0.7333333333333330, + 0.7391304347826090, + 0.7391304347826090, + 0.7446808510638300, + 0.7446808510638300, + 0.7291666666666670, + 0.7500000000000000, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7551020408163260, + 0.7551020408163260, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7551020408163260, + 0.7551020408163260, + 0.7600000000000000, + 0.7600000000000000, + 0.7450980392156860, + 0.7450980392156860, + 0.7600000000000000, + 0.7600000000000000, + 0.7600000000000000, + 0.7600000000000000, + 0.7551020408163260, + 0.7551020408163260, + 0.7551020408163260, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7346938775510200, + 0.7346938775510200, + 0.7346938775510200, + 0.7346938775510200, + 0.7346938775510200, + 0.7200000000000000, + 0.7346938775510200, + 0.7346938775510200, + 0.7200000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7551020408163260, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7446808510638300, + 0.7391304347826090, + 0.7391304347826090, + 0.7391304347826090, + 0.7391304347826090, + 0.7391304347826090, + 0.7446808510638300, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7291666666666670, + 0.7346938775510200, + 0.7346938775510200, + 0.7346938775510200, + 0.7346938775510200, + 0.7346938775510200, + 0.7200000000000000, + 0.7200000000000000, + 0.7200000000000000, + 0.7200000000000000, + 0.7200000000000000, + 0.7142857142857140, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7142857142857140, + 0.7083333333333330, + 0.7083333333333330, + 0.6938775510204080, + 0.6938775510204080, + 0.7021276595744680, + 0.7021276595744680, + 0.7173913043478260, + 0.7173913043478260, + 0.7272727272727270, + 0.7272727272727270, + 0.7111111111111110, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6808510638297870, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6888888888888890, + 0.6818181818181820, + 0.6818181818181820, + 0.6818181818181820, + 0.6818181818181820, + 0.6976744186046510, + 0.6976744186046510, + 0.7209302325581400, + 0.7142857142857140, + 0.6976744186046510, + 0.6976744186046510, + 0.6976744186046510, + 0.6818181818181820, + 0.6666666666666670, + 0.6382978723404260, + 0.6122448979591840, + 0.6122448979591840, + 0.6000000000000000, + 0.6000000000000000, + 0.5882352941176470, + 0.5882352941176470, + 0.5882352941176470, + 0.5882352941176470, + 0.6000000000000000, + 0.6122448979591840, + 0.6250000000000000, + 0.6250000000000000, + 0.6250000000000000, + 0.6250000000000000, + 0.6122448979591840, + 0.6122448979591840, + 0.6200000000000000, + 0.6200000000000000, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6458333333333330, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6521739130434780, + 0.6521739130434780, + 0.6521739130434780, + 0.6595744680851060, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6739130434782610, + 0.6808510638297870, + 0.6808510638297870, + 0.6956521739130430, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7272727272727270, + 0.7111111111111110, + 0.7111111111111110, + 0.7173913043478260, + 0.7111111111111110, + 0.7111111111111110, + 0.6956521739130430, + 0.6808510638297870, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6590909090909090, + 0.6590909090909090, + 0.6590909090909090, + 0.6590909090909090, + 0.6590909090909090, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6521739130434780, + 0.6521739130434780, + 0.6521739130434780, + 0.6444444444444440, + 0.6521739130434780, + 0.6521739130434780, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6521739130434780, + 0.6382978723404260, + 0.6382978723404260, + 0.6521739130434780, + 0.6521739130434780, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6595744680851060, + 0.6458333333333330, + 0.6458333333333330, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6458333333333330, + 0.6400000000000000, + 0.6400000000000000, + 0.6400000000000000, + 0.6274509803921570, + 0.6274509803921570, + 0.6274509803921570, + 0.6200000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6122448979591840, + 0.6122448979591840, + 0.6122448979591840, + 0.6122448979591840, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6122448979591840, + 0.6122448979591840, + 0.6250000000000000, + 0.6250000000000000, + 0.6304347826086960, + 0.6304347826086960, + 0.6304347826086960, + 0.6304347826086960, + 0.6444444444444440, + 0.6444444444444440, + 0.6304347826086960, + 0.6304347826086960, + 0.6304347826086960, + 0.6304347826086960, + 0.6382978723404260, + 0.6304347826086960, + 0.6444444444444440, + 0.6590909090909090, + 0.6444444444444440, + 0.6444444444444440, + 0.6222222222222220, + 0.6136363636363640, + 0.6046511627906980, + 0.6046511627906980, + 0.6046511627906980, + 0.6046511627906980, + 0.6136363636363640, + 0.6136363636363640, + 0.6136363636363640, + 0.6136363636363640, + 0.6136363636363640, + 0.6136363636363640, + 0.6136363636363640, + 0.6136363636363640, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6363636363636360, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6222222222222220, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6590909090909090, + 0.6590909090909090, + 0.6744186046511630, + 0.6744186046511630, + 0.6744186046511630, + 0.6744186046511630, + 0.6585365853658540, + 0.6829268292682930, + 0.6904761904761900, + 0.6744186046511630, + 0.6744186046511630, + 0.6744186046511630, + 0.6904761904761900, + 0.6904761904761900, + 0.6744186046511630, + 0.6744186046511630, + 0.6904761904761900, + 0.6904761904761900, + 0.6904761904761900, + 0.6744186046511630, + 0.6744186046511630, + 0.6744186046511630, + 0.6744186046511630, + 0.6744186046511630, + 0.6904761904761900, + 0.6904761904761900, + 0.6744186046511630, + 0.6744186046511630, + 0.6590909090909090, + 0.6590909090909090, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6444444444444440, + 0.6590909090909090, + 0.6590909090909090, + 0.6511627906976740, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6170212765957450, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.6086956521739130, + 0.6000000000000000, + 0.6000000000000000, + 0.6136363636363640, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6511627906976740, + 0.6511627906976740, + 0.6511627906976740, + 0.6590909090909090, + 0.6744186046511630, + 0.6744186046511630, + 0.6818181818181820, + 0.6818181818181820, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6739130434782610, + 0.6595744680851060, + 0.6595744680851060, + 0.6739130434782610, + 0.6976744186046510, + 0.6818181818181820, + 0.6888888888888890, + 0.6888888888888890, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6956521739130430, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6739130434782610, + 0.6739130434782610, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.6739130434782610, + 0.6888888888888890, + 0.6888888888888890, + 0.7045454545454550, + 0.7045454545454550, + 0.7045454545454550, + 0.7045454545454550, + 0.6739130434782610, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6808510638297870, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.6875000000000000, + 0.7021276595744680, + 0.7173913043478260, + 0.7173913043478260, + 0.7234042553191490, + 0.7021276595744680, + 0.7021276595744680, + 0.7083333333333330, + 0.7234042553191490, + 0.7234042553191490, + 0.7234042553191490, + 0.7234042553191490, + 0.7083333333333330, + 0.7083333333333330, + 0.6938775510204080, + 0.6938775510204080, + 0.6938775510204080, + 0.6938775510204080, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7291666666666670, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7659574468085110, + 0.7659574468085110, + 0.7826086956521740, + 0.7826086956521740, + 0.8043478260869560, + 0.8043478260869560, + 0.8043478260869560, + 0.8043478260869560, + 0.7826086956521740, + 0.7826086956521740, + 0.8000000000000000, + 0.8000000000000000, + 0.7826086956521740, + 0.7826086956521740, + 0.8043478260869560, + 0.8043478260869560, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7708333333333330, + 0.7755102040816330, + 0.7916666666666670, + 0.8085106382978720, + 0.8085106382978720, + 0.8125000000000000, + 0.8085106382978720, + 0.8085106382978720, + 0.8085106382978720, + 0.8085106382978720, + 0.8085106382978720, + 0.8260869565217390, + 0.8297872340425530, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8163265306122450, + 0.8125000000000000, + 0.8085106382978720, + 0.8085106382978720, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8222222222222220, + 0.8297872340425530, + 0.8297872340425530, + 0.8297872340425530, + 0.8297872340425530, + 0.8297872340425530, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8163265306122450, + 0.8163265306122450, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8541666666666670, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8541666666666670, + 0.8541666666666670, + 0.8541666666666670, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8723404255319150, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8775510204081630, + 0.8775510204081630, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8775510204081630, + 0.8958333333333330, + 0.8958333333333330, + 0.8958333333333330, + 0.8958333333333330, + 0.8958333333333330, + 0.8979591836734690, + 0.8979591836734690, + 0.8979591836734690, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.8979591836734690, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9019607843137260, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9200000000000000, + 0.9183673469387750, + 0.9000000000000000, + 0.9000000000000000, + 0.9019607843137260, + 0.9019607843137260, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9038461538461540, + 0.9056603773584910, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9074074074074070, + 0.9090909090909090, + 0.9259259259259260, + 0.9272727272727270, + 0.9272727272727270, + 0.9272727272727270, + 0.9285714285714290, + 0.9454545454545450, + 0.9454545454545450, + 0.9464285714285710, + 0.9464285714285710, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9636363636363640, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9642857142857140, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9649122807017540, + 0.9655172413793100, + 0.9655172413793100, + 0.9655172413793100, + 0.9655172413793100, + 0.9824561403508770, + 0.9824561403508770, + 0.9824561403508770 + } + }, + { PLACE_CATEG_ID_WORK, + { + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0181818181818182, + 0.0181818181818182, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0181818181818182, + 0.0181818181818182, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0350877192982456, + 0.0350877192982456, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0377358490566038, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0588235294117647, + 0.0588235294117647, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1698113207547170, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1886792452830190, + 0.1886792452830190, + 0.1886792452830190, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2115384615384620, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2641509433962260, + 0.2641509433962260, + 0.2641509433962260, + 0.2692307692307690, + 0.2800000000000000, + 0.2800000000000000, + 0.2916666666666670, + 0.2978723404255320, + 0.2978723404255320, + 0.2978723404255320, + 0.2978723404255320, + 0.2916666666666670, + 0.3200000000000000, + 0.3333333333333330, + 0.3461538461538460, + 0.3461538461538460, + 0.3461538461538460, + 0.3461538461538460, + 0.3529411764705880, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3725490196078430, + 0.3725490196078430, + 0.3725490196078430, + 0.3725490196078430, + 0.3725490196078430, + 0.3846153846153850, + 0.3846153846153850, + 0.4000000000000000, + 0.4117647058823530, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4489795918367350, + 0.4680851063829790, + 0.4680851063829790, + 0.4680851063829790, + 0.4680851063829790, + 0.5111111111111110, + 0.5217391304347830, + 0.5217391304347830, + 0.5217391304347830, + 0.5217391304347830, + 0.5217391304347830, + 0.5217391304347830, + 0.5319148936170210, + 0.5434782608695650, + 0.5434782608695650, + 0.5652173913043480, + 0.5652173913043480, + 0.5652173913043480, + 0.5652173913043480, + 0.5777777777777780, + 0.5777777777777780, + 0.5777777777777780, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6086956521739130, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6444444444444440, + 0.6444444444444440, + 0.6744186046511630, + 0.6818181818181820, + 0.6818181818181820, + 0.6818181818181820, + 0.6888888888888890, + 0.6888888888888890, + 0.6888888888888890, + 0.7045454545454550, + 0.7045454545454550, + 0.7045454545454550, + 0.7346938775510200, + 0.7346938775510200, + 0.7400000000000000, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7547169811320760, + 0.7547169811320760, + 0.7692307692307690, + 0.7692307692307690, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7735849056603770, + 0.7857142857142860, + 0.7857142857142860, + 0.7857142857142860, + 0.7857142857142860, + 0.8148148148148150, + 0.8148148148148150, + 0.8214285714285710, + 0.8214285714285710, + 0.8275862068965520, + 0.8275862068965520, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8620689655172410, + 0.8620689655172410, + 0.8666666666666670, + 0.8666666666666670, + 0.8524590163934430, + 0.8524590163934430, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8947368421052630, + 0.8947368421052630, + 0.8947368421052630, + 0.8947368421052630, + 0.8947368421052630, + 0.8947368421052630, + 0.8965517241379310, + 0.8965517241379310, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8852459016393440, + 0.8852459016393440, + 0.8833333333333330, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8852459016393440, + 0.8870967741935480, + 0.8870967741935480, + 0.8870967741935480, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9016393442622950, + 0.9016393442622950, + 0.9016393442622950, + 0.9016393442622950, + 0.9016393442622950, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.8983050847457630, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8666666666666670, + 0.8644067796610170, + 0.8666666666666670, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8360655737704920, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8474576271186440, + 0.8474576271186440, + 0.8500000000000000, + 0.8500000000000000, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8644067796610170, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8644067796610170, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8524590163934430, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8620689655172410, + 0.8620689655172410, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8833333333333330, + 0.8833333333333330, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8709677419354840, + 0.8709677419354840, + 0.8709677419354840, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8688524590163930, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8833333333333330, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8793103448275860, + 0.8771929824561400, + 0.8771929824561400, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8596491228070170, + 0.8596491228070170, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8214285714285710, + 0.8214285714285710, + 0.8214285714285710, + 0.8181818181818180, + 0.8181818181818180, + 0.8148148148148150, + 0.8148148148148150, + 0.8000000000000000, + 0.7962962962962960, + 0.7818181818181820, + 0.7777777777777780, + 0.7735849056603770, + 0.7692307692307690, + 0.7692307692307690, + 0.7692307692307690, + 0.7735849056603770, + 0.7735849056603770, + 0.7692307692307690, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7592592592592590, + 0.7454545454545450, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7192982456140350, + 0.7068965517241380, + 0.7068965517241380, + 0.7017543859649120, + 0.7142857142857140, + 0.7142857142857140, + 0.7272727272727270, + 0.7222222222222220, + 0.7222222222222220, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7017543859649120, + 0.7017543859649120, + 0.7017543859649120, + 0.6964285714285710, + 0.6964285714285710, + 0.6964285714285710, + 0.6964285714285710, + 0.6964285714285710, + 0.6964285714285710, + 0.6964285714285710, + 0.6964285714285710, + 0.7222222222222220, + 0.7222222222222220, + 0.7090909090909090, + 0.6964285714285710, + 0.7090909090909090, + 0.7090909090909090, + 0.6964285714285710, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7017543859649120, + 0.6785714285714290, + 0.6607142857142860, + 0.6491228070175440, + 0.6491228070175440, + 0.6428571428571430, + 0.6428571428571430, + 0.6428571428571430, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6363636363636360, + 0.6250000000000000, + 0.6250000000000000, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6111111111111110, + 0.6181818181818180, + 0.6181818181818180, + 0.6296296296296300, + 0.6296296296296300, + 0.6296296296296300, + 0.6111111111111110, + 0.6111111111111110, + 0.6226415094339620, + 0.6153846153846150, + 0.6153846153846150, + 0.6274509803921570, + 0.6037735849056600, + 0.5961538461538460, + 0.6078431372549020, + 0.6078431372549020, + 0.6078431372549020, + 0.5961538461538460, + 0.5882352941176470, + 0.5769230769230770, + 0.5769230769230770, + 0.5600000000000000, + 0.5510204081632650, + 0.5510204081632650, + 0.5510204081632650, + 0.5510204081632650, + 0.5400000000000000, + 0.5102040816326530, + 0.5102040816326530, + 0.5102040816326530, + 0.5102040816326530, + 0.5102040816326530, + 0.5000000000000000, + 0.4680851063829790, + 0.4680851063829790, + 0.4680851063829790, + 0.4680851063829790, + 0.4680851063829790, + 0.4680851063829790, + 0.4565217391304350, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.3695652173913040, + 0.3695652173913040, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3469387755102040, + 0.3111111111111110, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3333333333333330, + 0.3333333333333330, + 0.3170731707317070, + 0.3170731707317070, + 0.2790697674418600, + 0.2790697674418600, + 0.2727272727272730, + 0.2558139534883720, + 0.2558139534883720, + 0.2558139534883720, + 0.2500000000000000, + 0.2500000000000000, + 0.2391304347826090, + 0.2391304347826090, + 0.2444444444444440, + 0.2444444444444440, + 0.1818181818181820, + 0.1818181818181820, + 0.1702127659574470, + 0.1666666666666670, + 0.1632653061224490, + 0.1632653061224490, + 0.1600000000000000, + 0.1428571428571430, + 0.1400000000000000, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1538461538461540, + 0.1698113207547170, + 0.1509433962264150, + 0.1509433962264150, + 0.1372549019607840, + 0.1346153846153850, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1272727272727270, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1090909090909090, + 0.1071428571428570, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.1090909090909090, + 0.0925925925925926, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.0869565217391304, + 0.0888888888888889, + 0.0888888888888889, + 0.0888888888888889, + 0.0909090909090909, + 0.0909090909090909, + 0.0888888888888889, + 0.0888888888888889, + 0.0888888888888889, + 0.0888888888888889, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0851063829787234, + 0.0851063829787234, + 0.0851063829787234, + 0.1041666666666670, + 0.1000000000000000, + 0.1000000000000000, + 0.0816326530612245, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0961538461538462, + 0.0961538461538462, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0961538461538462, + 0.1000000000000000, + 0.1000000000000000, + 0.0961538461538462, + 0.0980392156862745, + 0.0980392156862745, + 0.1000000000000000, + 0.1041666666666670, + 0.1041666666666670, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0740740740740741, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0666666666666667, + 0.0666666666666667, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0517241379310345, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0517241379310345, + 0.0517241379310345, + 0.0526315789473684, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0338983050847458, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0545454545454545, + 0.0535714285714286, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.1090909090909090, + 0.1111111111111110, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1509433962264150, + 0.1818181818181820, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.2000000000000000, + 0.2037037037037040, + 0.2363636363636360, + 0.2363636363636360, + 0.2407407407407410, + 0.2407407407407410, + 0.2452830188679250, + 0.2452830188679250, + 0.2452830188679250, + 0.2500000000000000, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2745098039215690, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2941176470588230, + 0.2941176470588230, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3137254901960780, + 0.3269230769230770, + 0.3396226415094340, + 0.3396226415094340, + 0.3461538461538460, + 0.3653846153846150, + 0.3846153846153850, + 0.3846153846153850, + 0.3846153846153850, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.4117647058823530, + 0.4117647058823530, + 0.4117647058823530, + 0.4117647058823530, + 0.4200000000000000, + 0.4313725490196080, + 0.4313725490196080, + 0.4313725490196080, + 0.4313725490196080, + 0.4313725490196080, + 0.4313725490196080, + 0.4313725490196080, + 0.4200000000000000, + 0.4200000000000000, + 0.4200000000000000, + 0.4200000000000000, + 0.4200000000000000, + 0.4200000000000000, + 0.4313725490196080, + 0.4313725490196080, + 0.4509803921568630, + 0.4509803921568630, + 0.4509803921568630, + 0.4615384615384620, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.5098039215686270, + 0.5200000000000000, + 0.5306122448979590, + 0.5306122448979590, + 0.5306122448979590, + 0.5306122448979590, + 0.5625000000000000, + 0.5625000000000000, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.5957446808510640, + 0.6041666666666670, + 0.6041666666666670, + 0.6122448979591840, + 0.6122448979591840, + 0.6326530612244900, + 0.6400000000000000, + 0.6470588235294120, + 0.6470588235294120, + 0.6600000000000000, + 0.6600000000000000, + 0.6600000000000000, + 0.7021276595744680, + 0.7021276595744680, + 0.7173913043478260, + 0.7333333333333330, + 0.7333333333333330, + 0.7333333333333330, + 0.7333333333333330, + 0.7333333333333330, + 0.7727272727272730, + 0.7826086956521740, + 0.7872340425531920, + 0.7916666666666670, + 0.8163265306122450, + 0.8163265306122450, + 0.8200000000000000, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8148148148148150, + 0.8148148148148150, + 0.8148148148148150, + 0.8148148148148150, + 0.8245614035087720, + 0.8245614035087720, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8275862068965520, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8524590163934430, + 0.8524590163934430, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8709677419354840, + 0.8709677419354840, + 0.8593750000000000, + 0.8730158730158730, + 0.8730158730158730, + 0.8730158730158730, + 0.8593750000000000, + 0.8593750000000000, + 0.8593750000000000, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8615384615384620, + 0.8769230769230770, + 0.8769230769230770, + 0.8906250000000000, + 0.8906250000000000, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9193548387096770, + 0.9193548387096770, + 0.9193548387096770, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9166666666666670, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9491525423728810, + 0.9491525423728810, + 0.9491525423728810, + 0.9333333333333330, + 0.9333333333333330, + 0.9322033898305080, + 0.9322033898305080, + 0.9322033898305080, + 0.9322033898305080, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9310344827586210, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9152542372881350, + 0.9180327868852460, + 0.9180327868852460, + 0.9166666666666670, + 0.9016393442622950, + 0.9016393442622950, + 0.9016393442622950, + 0.9032258064516130, + 0.9047619047619050, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9062500000000000, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9076923076923080, + 0.9230769230769230, + 0.9230769230769230, + 0.9230769230769230, + 0.9218750000000000, + 0.9206349206349210, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9218750000000000, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9365079365079360, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9508196721311470, + 0.9508196721311470, + 0.9354838709677420, + 0.9354838709677420, + 0.9354838709677420, + 0.9333333333333330, + 0.9310344827586210, + 0.9298245614035090, + 0.9122807017543860, + 0.9122807017543860, + 0.9122807017543860, + 0.9122807017543860, + 0.9107142857142860, + 0.9090909090909090, + 0.9259259259259260, + 0.9259259259259260, + 0.9259259259259260, + 0.9259259259259260, + 0.9272727272727270, + 0.9259259259259260, + 0.9298245614035090, + 0.9298245614035090, + 0.9298245614035090, + 0.9310344827586210, + 0.9310344827586210, + 0.9333333333333330, + 0.9491525423728810, + 0.9491525423728810, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9344262295081970, + 0.9333333333333330, + 0.9333333333333330, + 0.9333333333333330, + 0.9322033898305080, + 0.9322033898305080, + 0.9322033898305080, + 0.9482758620689660, + 0.9482758620689660, + 0.9473684210526320, + 0.9482758620689660, + 0.9482758620689660, + 0.9473684210526320, + 0.9655172413793100, + 0.9655172413793100, + 0.9491525423728810, + 0.9491525423728810, + 0.9482758620689660, + 0.9491525423728810, + 0.9491525423728810, + 0.9491525423728810, + 0.9491525423728810, + 0.9491525423728810, + 0.9508196721311470, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9491525423728810, + 0.9491525423728810, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9508196721311470, + 0.9500000000000000, + 0.9500000000000000, + 0.9661016949152540, + 0.9655172413793100, + 0.9655172413793100, + 0.9655172413793100, + 0.9655172413793100, + 0.9655172413793100, + 0.9661016949152540, + 0.9661016949152540, + 0.9661016949152540, + 0.9661016949152540, + 0.9661016949152540, + 0.9661016949152540, + 0.9661016949152540, + 0.9500000000000000, + 0.9500000000000000, + 0.9500000000000000, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9516129032258060, + 0.9531250000000000, + 0.9531250000000000, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9687500000000000, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9677419354838710, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9682539682539680, + 0.9531250000000000, + 0.9531250000000000, + 0.9531250000000000, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9393939393939390, + 0.9393939393939390, + 0.9393939393939390, + 0.9393939393939390, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9538461538461540, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9516129032258060, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9523809523809520, + 0.9516129032258060, + 0.9365079365079360, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9206349206349210, + 0.9193548387096770, + 0.9193548387096770, + 0.9193548387096770, + 0.9193548387096770, + 0.9193548387096770, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9180327868852460, + 0.9032258064516130, + 0.9032258064516130, + 0.9032258064516130, + 0.8870967741935480, + 0.8593750000000000, + 0.8571428571428570, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8500000000000000, + 0.8360655737704920, + 0.8360655737704920, + 0.8225806451612900, + 0.8225806451612900, + 0.8225806451612900, + 0.8225806451612900, + 0.8360655737704920, + 0.8333333333333330, + 0.8474576271186440, + 0.8474576271186440, + 0.8333333333333330, + 0.8333333333333330, + 0.8064516129032260, + 0.7936507936507940, + 0.7812500000000000, + 0.7692307692307690, + 0.7692307692307690, + 0.7692307692307690, + 0.7692307692307690, + 0.7656250000000000, + 0.7692307692307690, + 0.7692307692307690, + 0.7692307692307690, + 0.7692307692307690, + 0.7656250000000000, + 0.7656250000000000, + 0.7619047619047620, + 0.7619047619047620, + 0.7619047619047620, + 0.7619047619047620, + 0.7619047619047620, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7343750000000000, + 0.7343750000000000, + 0.7343750000000000, + 0.7343750000000000, + 0.7343750000000000, + 0.7343750000000000, + 0.7343750000000000, + 0.7230769230769230, + 0.7187500000000000, + 0.7187500000000000, + 0.7187500000000000, + 0.7230769230769230, + 0.7230769230769230, + 0.7230769230769230, + 0.7142857142857140, + 0.7258064516129030, + 0.7213114754098360, + 0.7213114754098360, + 0.7213114754098360, + 0.7288135593220340, + 0.7321428571428570, + 0.7321428571428570, + 0.7321428571428570, + 0.7192982456140350, + 0.7272727272727270, + 0.7142857142857140, + 0.7142857142857140, + 0.7090909090909090, + 0.7222222222222220, + 0.7222222222222220, + 0.7222222222222220, + 0.7307692307692310, + 0.7037037037037040, + 0.7037037037037040, + 0.6909090909090910, + 0.6909090909090910, + 0.6785714285714290, + 0.6785714285714290, + 0.6785714285714290, + 0.6551724137931030, + 0.6551724137931030, + 0.6491228070175440, + 0.6428571428571430, + 0.6545454545454550, + 0.6250000000000000, + 0.6250000000000000, + 0.6250000000000000, + 0.6250000000000000, + 0.6481481481481480, + 0.6296296296296300, + 0.6274509803921570, + 0.6274509803921570, + 0.6153846153846150, + 0.6000000000000000, + 0.5918367346938780, + 0.5918367346938780, + 0.5800000000000000, + 0.5800000000000000, + 0.5800000000000000, + 0.5800000000000000, + 0.5686274509803920, + 0.5686274509803920, + 0.5714285714285710, + 0.5714285714285710, + 0.5714285714285710, + 0.5625000000000000, + 0.5625000000000000, + 0.5600000000000000, + 0.5510204081632650, + 0.5510204081632650, + 0.5510204081632650, + 0.5510204081632650, + 0.5192307692307690, + 0.5000000000000000, + 0.4821428571428570, + 0.4821428571428570, + 0.4821428571428570, + 0.4727272727272730, + 0.4727272727272730, + 0.4727272727272730, + 0.4561403508771930, + 0.4642857142857140, + 0.4642857142857140, + 0.4642857142857140, + 0.4642857142857140, + 0.4642857142857140, + 0.4464285714285710, + 0.4545454545454550, + 0.4629629629629630, + 0.4629629629629630, + 0.4629629629629630, + 0.4509803921568630, + 0.4230769230769230, + 0.4117647058823530, + 0.4117647058823530, + 0.4038461538461540, + 0.4117647058823530, + 0.4117647058823530, + 0.4117647058823530, + 0.4038461538461540, + 0.4038461538461540, + 0.3962264150943400, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4038461538461540, + 0.4038461538461540, + 0.4038461538461540, + 0.3962264150943400, + 0.3888888888888890, + 0.3888888888888890, + 0.3636363636363640, + 0.3636363636363640, + 0.3269230769230770, + 0.3148148148148150, + 0.3148148148148150, + 0.3148148148148150, + 0.2884615384615380, + 0.2884615384615380, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2553191489361700, + 0.2391304347826090, + 0.2391304347826090, + 0.2444444444444440, + 0.2391304347826090, + 0.2340425531914890, + 0.2500000000000000, + 0.2340425531914890, + 0.2340425531914890, + 0.2340425531914890, + 0.2340425531914890, + 0.2291666666666670, + 0.2291666666666670, + 0.2244897959183670, + 0.2291666666666670, + 0.2291666666666670, + 0.2083333333333330, + 0.2040816326530610, + 0.1875000000000000, + 0.1702127659574470, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1875000000000000, + 0.1875000000000000, + 0.2040816326530610, + 0.2040816326530610, + 0.2000000000000000, + 0.2000000000000000, + 0.1960784313725490, + 0.1960784313725490, + 0.1923076923076920, + 0.1923076923076920, + 0.1886792452830190, + 0.1698113207547170, + 0.1346153846153850, + 0.1346153846153850, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.0943396226415094, + 0.0925925925925926, + 0.0943396226415094, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.0909090909090909, + 0.0909090909090909, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0847457627118644, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0819672131147541, + 0.0806451612903226, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0666666666666667, + 0.0677966101694915, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0517241379310345, + 0.0517241379310345, + 0.0508474576271187, + 0.0500000000000000, + 0.0491803278688525, + 0.0500000000000000, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0476190476190476, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0468750000000000, + 0.0483870967741936, + 0.0483870967741936, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0344827586206897, + 0.0344827586206897, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0317460317460317, + 0.0317460317460317, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0149253731343284, + 0.0147058823529412, + 0.0147058823529412, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0500000000000000, + 0.0508474576271187, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0983606557377049, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.1034482758620690, + 0.1034482758620690, + 0.1034482758620690, + 0.1034482758620690, + 0.1034482758620690, + 0.1186440677966100, + 0.1166666666666670, + 0.1311475409836070, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1355932203389830, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1666666666666670, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1818181818181820, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.2181818181818180, + 0.2222222222222220, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2307692307692310, + 0.2352941176470590, + 0.2448979591836730, + 0.2600000000000000, + 0.2600000000000000, + 0.2549019607843140, + 0.2600000000000000, + 0.2745098039215690, + 0.2884615384615380, + 0.2884615384615380, + 0.2884615384615380, + 0.2884615384615380, + 0.2884615384615380, + 0.2941176470588230, + 0.2941176470588230, + 0.2941176470588230, + 0.3076923076923080, + 0.3137254901960780, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3207547169811320, + 0.3454545454545450, + 0.3454545454545450, + 0.3454545454545450, + 0.3454545454545450, + 0.3454545454545450, + 0.3454545454545450, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3750000000000000, + 0.3750000000000000, + 0.3859649122807020, + 0.3965517241379310, + 0.4181818181818180, + 0.4181818181818180, + 0.4363636363636360, + 0.4363636363636360, + 0.4464285714285710, + 0.4464285714285710, + 0.4727272727272730, + 0.4821428571428570, + 0.4821428571428570, + 0.4912280701754390, + 0.5172413793103450, + 0.5172413793103450, + 0.5263157894736840, + 0.5263157894736840, + 0.5263157894736840, + 0.5263157894736840, + 0.5263157894736840, + 0.5263157894736840, + 0.5660377358490570, + 0.5660377358490570, + 0.5660377358490570, + 0.5660377358490570, + 0.5660377358490570, + 0.5740740740740740, + 0.5818181818181820, + 0.5818181818181820, + 0.5925925925925930, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6111111111111110, + 0.6470588235294120, + 0.6666666666666670, + 0.6800000000000000, + 0.6938775510204080, + 0.6938775510204080, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7200000000000000, + 0.7200000000000000, + 0.7400000000000000, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7500000000000000, + 0.7500000000000000, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7358490566037730, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7547169811320760, + 0.7592592592592590, + 0.7592592592592590, + 0.7719298245614030, + 0.7719298245614030, + 0.7719298245614030, + 0.7758620689655170, + 0.7758620689655170, + 0.7758620689655170, + 0.7796610169491530, + 0.7796610169491530, + 0.8032786885245900, + 0.8032786885245900, + 0.8032786885245900, + 0.8064516129032260, + 0.8281250000000000, + 0.8281250000000000, + 0.8307692307692310, + 0.8307692307692310, + 0.8281250000000000, + 0.8281250000000000, + 0.8307692307692310, + 0.8307692307692310, + 0.8333333333333330, + 0.8333333333333330, + 0.8333333333333330, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8382352941176470, + 0.8405797101449270, + 0.8405797101449270, + 0.8382352941176470, + 0.8382352941176470, + 0.8382352941176470, + 0.8382352941176470, + 0.8382352941176470, + 0.8428571428571430, + 0.8450704225352110, + 0.8571428571428570, + 0.8571428571428570, + 0.8550724637681160, + 0.8550724637681160, + 0.8550724637681160, + 0.8676470588235290, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8787878787878790, + 0.8787878787878790, + 0.8787878787878790, + 0.8787878787878790, + 0.8787878787878790, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8840579710144930, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8985507246376810, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9000000000000000, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9130434782608700, + 0.9117647058823530, + 0.9130434782608700, + 0.9117647058823530, + 0.9104477611940300, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9090909090909090, + 0.9062500000000000, + 0.9076923076923080, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.9047619047619050, + 0.8769230769230770, + 0.8750000000000000, + 0.8730158730158730, + 0.8730158730158730, + 0.8730158730158730, + 0.8730158730158730, + 0.8730158730158730, + 0.8730158730158730, + 0.8593750000000000, + 0.8593750000000000, + 0.8615384615384620, + 0.8615384615384620, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8548387096774190, + 0.8571428571428570, + 0.8571428571428570, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8387096774193550, + 0.8387096774193550, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8666666666666670, + 0.8709677419354840, + 0.8593750000000000, + 0.8593750000000000, + 0.8593750000000000, + 0.8593750000000000, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8636363636363640, + 0.8695652173913040, + 0.8695652173913040, + 0.8714285714285710, + 0.8714285714285710, + 0.8714285714285710, + 0.8714285714285710, + 0.8714285714285710, + 0.8714285714285710, + 0.8714285714285710, + 0.8714285714285710, + 0.8732394366197180, + 0.8732394366197180, + 0.8857142857142860, + 0.8840579710144930, + 0.8970588235294120, + 0.8970588235294120, + 0.8955223880597010, + 0.8939393939393940, + 0.8955223880597010, + 0.8970588235294120, + 0.8985507246376810, + 0.9000000000000000, + 0.9000000000000000, + 0.8985507246376810, + 0.8985507246376810, + 0.8985507246376810, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.8970588235294120, + 0.8970588235294120, + 0.8955223880597010, + 0.8970588235294120, + 0.8970588235294120, + 0.8970588235294120, + 0.8985507246376810, + 0.8985507246376810, + 0.9000000000000000, + 0.9142857142857140, + 0.9142857142857140, + 0.9154929577464790, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9178082191780820, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9166666666666670, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9295774647887320, + 0.9305555555555560, + 0.9305555555555560, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9436619718309860, + 0.9444444444444440, + 0.9444444444444440, + 0.9436619718309860, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9428571428571430, + 0.9295774647887320, + 0.9285714285714290, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9275362318840580, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9142857142857140, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9154929577464790, + 0.9285714285714290, + 0.9275362318840580, + 0.9264705882352940, + 0.9264705882352940, + 0.9264705882352940, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9253731343283580, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9104477611940300, + 0.9117647058823530, + 0.9117647058823530, + 0.9130434782608700, + 0.9117647058823530, + 0.9130434782608700, + 0.9000000000000000, + 0.9000000000000000, + 0.8873239436619720, + 0.8873239436619720, + 0.8857142857142860, + 0.8840579710144930, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8823529411764710, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8656716417910450, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8382352941176470, + 0.8260869565217390, + 0.8260869565217390, + 0.8260869565217390, + 0.8235294117647060, + 0.8235294117647060, + 0.8260869565217390, + 0.8382352941176470, + 0.8382352941176470, + 0.8382352941176470, + 0.8382352941176470, + 0.8358208955223880, + 0.8484848484848480, + 0.8358208955223880, + 0.8358208955223880, + 0.8333333333333330, + 0.8208955223880600, + 0.8208955223880600, + 0.8208955223880600, + 0.8208955223880600, + 0.8208955223880600, + 0.8208955223880600, + 0.8208955223880600, + 0.8088235294117650, + 0.8059701492537310, + 0.8030303030303030, + 0.8030303030303030, + 0.8030303030303030, + 0.8030303030303030, + 0.8030303030303030, + 0.8000000000000000, + 0.8000000000000000, + 0.7878787878787880, + 0.7878787878787880, + 0.7761194029850750, + 0.7761194029850750, + 0.7727272727272730, + 0.7656250000000000, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7777777777777780, + 0.7903225806451610, + 0.8032786885245900, + 0.8032786885245900, + 0.8032786885245900, + 0.8032786885245900, + 0.8000000000000000, + 0.7868852459016390, + 0.7868852459016390, + 0.7868852459016390, + 0.7833333333333330, + 0.7833333333333330, + 0.7540983606557380, + 0.7500000000000000, + 0.7500000000000000, + 0.7377049180327870, + 0.7258064516129030, + 0.7258064516129030, + 0.7258064516129030, + 0.7258064516129030, + 0.7258064516129030, + 0.7213114754098360, + 0.7213114754098360, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7166666666666670, + 0.7118644067796610, + 0.7017543859649120, + 0.7090909090909090, + 0.6842105263157900, + 0.6842105263157900, + 0.6724137931034480, + 0.6666666666666670, + 0.6666666666666670, + 0.6607142857142860, + 0.6545454545454550, + 0.6428571428571430, + 0.6428571428571430, + 0.6428571428571430, + 0.6545454545454550, + 0.6481481481481480, + 0.6603773584905660, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6415094339622640, + 0.6415094339622640, + 0.6415094339622640, + 0.5833333333333330, + 0.5833333333333330, + 0.5833333333333330, + 0.5625000000000000, + 0.5625000000000000, + 0.5625000000000000, + 0.5510204081632650, + 0.5416666666666670, + 0.5416666666666670, + 0.5306122448979590, + 0.5000000000000000, + 0.4814814814814810, + 0.4385964912280700, + 0.4482758620689660, + 0.4310344827586210, + 0.4237288135593220, + 0.4166666666666670, + 0.4166666666666670, + 0.3833333333333330, + 0.3898305084745760, + 0.3898305084745760, + 0.3898305084745760, + 0.3793103448275860, + 0.3793103448275860, + 0.3728813559322030, + 0.3728813559322030, + 0.3728813559322030, + 0.3666666666666670, + 0.3606557377049180, + 0.3606557377049180, + 0.3548387096774190, + 0.3548387096774190, + 0.3437500000000000, + 0.3437500000000000, + 0.3437500000000000, + 0.3437500000000000, + 0.3281250000000000, + 0.3230769230769230, + 0.3230769230769230, + 0.3333333333333330, + 0.3225806451612900, + 0.3278688524590160, + 0.2931034482758620, + 0.2931034482758620, + 0.2881355932203390, + 0.2881355932203390, + 0.2881355932203390, + 0.2711864406779660, + 0.2786885245901640, + 0.2741935483870970, + 0.2542372881355930, + 0.2542372881355930, + 0.2542372881355930, + 0.2500000000000000, + 0.2459016393442620, + 0.2459016393442620, + 0.2459016393442620, + 0.2459016393442620, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2333333333333330, + 0.2295081967213110, + 0.2295081967213110, + 0.2295081967213110, + 0.2333333333333330, + 0.2203389830508470, + 0.2203389830508470, + 0.2166666666666670, + 0.2166666666666670, + 0.2131147540983610, + 0.2096774193548390, + 0.2307692307692310, + 0.2187500000000000, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2131147540983610, + 0.2000000000000000, + 0.2131147540983610, + 0.2000000000000000, + 0.2000000000000000, + 0.1967213114754100, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1875000000000000, + 0.1846153846153850, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1818181818181820, + 0.1764705882352940, + 0.1764705882352940, + 0.1791044776119400, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1818181818181820, + 0.1818181818181820, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.2033898305084750, + 0.2033898305084750, + 0.2033898305084750, + 0.2068965517241380, + 0.2068965517241380, + 0.2068965517241380, + 0.2142857142857140, + 0.2142857142857140, + 0.2105263157894740, + 0.2142857142857140, + 0.2142857142857140, + 0.2181818181818180, + 0.2181818181818180, + 0.2181818181818180, + 0.2181818181818180, + 0.2181818181818180, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2075471698113210, + 0.2037037037037040, + 0.2075471698113210, + 0.1886792452830190, + 0.1818181818181820, + 0.1666666666666670, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1754385964912280, + 0.1785714285714290, + 0.1636363636363640, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1551724137931030, + 0.1551724137931030, + 0.1525423728813560, + 0.1525423728813560, + 0.1500000000000000, + 0.1500000000000000, + 0.1500000000000000, + 0.1500000000000000, + 0.1333333333333330, + 0.1333333333333330, + 0.1355932203389830, + 0.1355932203389830, + 0.1379310344827590, + 0.1379310344827590, + 0.1403508771929820, + 0.1403508771929820, + 0.1403508771929820, + 0.1355932203389830, + 0.1355932203389830, + 0.1355932203389830, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1166666666666670, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.1076923076923080, + 0.1076923076923080, + 0.1060606060606060, + 0.1060606060606060, + 0.0923076923076923, + 0.0923076923076923, + 0.0909090909090909, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0895522388059701, + 0.0882352941176471, + 0.0882352941176471, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0869565217391304, + 0.0869565217391304, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0882352941176471, + 0.0895522388059701, + 0.0895522388059701, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.0882352941176471, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0869565217391304, + 0.0735294117647059, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0606060606060606, + 0.0461538461538462, + 0.0461538461538462, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0307692307692308, + 0.0307692307692308, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0298507462686567, + 0.0285714285714286, + 0.0285714285714286, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0298507462686567, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0298507462686567, + 0.0298507462686567, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0303030303030303, + 0.0303030303030303, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0142857142857143, + 0.0142857142857143, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0140845070422535, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0135135135135135, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0333333333333333, + 0.0333333333333333, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0847457627118644, + 0.0847457627118644, + 0.0862068965517241, + 0.1034482758620690, + 0.1034482758620690, + 0.1034482758620690, + 0.1186440677966100, + 0.1186440677966100, + 0.1206896551724140, + 0.1206896551724140, + 0.1206896551724140, + 0.1206896551724140, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1833333333333330, + 0.1833333333333330, + 0.1833333333333330, + 0.1833333333333330, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.2096774193548390, + 0.2131147540983610, + 0.2258064516129030, + 0.2295081967213110, + 0.2295081967213110, + 0.2372881355932200, + 0.2542372881355930, + 0.2542372881355930, + 0.2586206896551720, + 0.2586206896551720, + 0.2631578947368420, + 0.2678571428571430, + 0.2678571428571430, + 0.2807017543859650, + 0.2807017543859650, + 0.2807017543859650, + 0.2807017543859650, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2857142857142860, + 0.2982456140350880, + 0.3103448275862070, + 0.3275862068965520, + 0.3389830508474580, + 0.3448275862068970, + 0.3684210526315790, + 0.3684210526315790, + 0.3859649122807020, + 0.3965517241379310, + 0.3965517241379310, + 0.3965517241379310, + 0.3965517241379310, + 0.3965517241379310, + 0.3898305084745760, + 0.3898305084745760, + 0.3898305084745760, + 0.3898305084745760, + 0.4000000000000000, + 0.4067796610169490, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4067796610169490, + 0.4067796610169490, + 0.4166666666666670, + 0.4333333333333330, + 0.4333333333333330, + 0.4406779661016950, + 0.4406779661016950, + 0.4406779661016950, + 0.4333333333333330, + 0.4262295081967210, + 0.4426229508196720, + 0.4736842105263160, + 0.4827586206896550, + 0.4915254237288140, + 0.5000000000000000, + 0.5084745762711860, + 0.5084745762711860, + 0.5172413793103450, + 0.5172413793103450, + 0.5172413793103450, + 0.5172413793103450, + 0.5344827586206900, + 0.5344827586206900, + 0.5636363636363640, + 0.5636363636363640, + 0.6037735849056600, + 0.6111111111111110, + 0.6000000000000000, + 0.6000000000000000, + 0.6111111111111110, + 0.6111111111111110, + 0.6111111111111110, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6181818181818180, + 0.6296296296296300, + 0.6296296296296300, + 0.6415094339622640, + 0.6666666666666670, + 0.6800000000000000, + 0.6938775510204080, + 0.7000000000000000, + 0.7000000000000000, + 0.7115384615384620, + 0.7115384615384620, + 0.7115384615384620, + 0.7169811320754720, + 0.7413793103448280, + 0.7413793103448280, + 0.7413793103448280, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7627118644067800, + 0.7627118644067800, + 0.7741935483870970, + 0.7741935483870970, + 0.7741935483870970, + 0.7868852459016390, + 0.7903225806451610, + 0.7903225806451610, + 0.7936507936507940, + 0.7936507936507940, + 0.7936507936507940, + 0.7936507936507940, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8125000000000000, + 0.8153846153846150, + 0.8153846153846150, + 0.8153846153846150, + 0.8153846153846150, + 0.8153846153846150, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8358208955223880, + 0.8382352941176470, + 0.8358208955223880, + 0.8507462686567160, + 0.8507462686567160, + 0.8507462686567160, + 0.8507462686567160, + 0.8507462686567160, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8550724637681160, + 0.8550724637681160, + 0.8550724637681160, + 0.8550724637681160, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8805970149253730, + 0.8805970149253730, + 0.8805970149253730, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8805970149253730, + 0.8939393939393940, + 0.8923076923076920, + 0.8923076923076920, + 0.8923076923076920, + 0.8787878787878790, + 0.8787878787878790, + 0.8656716417910450, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8550724637681160, + 0.8550724637681160, + 0.8550724637681160, + 0.8550724637681160, + 0.8550724637681160, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8529411764705880, + 0.8656716417910450, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8676470588235290, + 0.8550724637681160, + 0.8428571428571430, + 0.8428571428571430, + 0.8428571428571430, + 0.8428571428571430, + 0.8428571428571430, + 0.8428571428571430, + 0.8428571428571430, + 0.8428571428571430, + 0.8405797101449270, + 0.8405797101449270, + 0.8405797101449270, + 0.8285714285714290, + 0.8285714285714290, + 0.8285714285714290, + 0.8285714285714290, + 0.8285714285714290, + 0.8285714285714290, + 0.8235294117647060, + 0.8484848484848480, + 0.8461538461538460, + 0.8461538461538460, + 0.8461538461538460, + 0.8437500000000000, + 0.8181818181818180, + 0.8181818181818180, + 0.8181818181818180, + 0.8208955223880600, + 0.8208955223880600, + 0.8088235294117650, + 0.8088235294117650, + 0.8088235294117650, + 0.8088235294117650, + 0.8088235294117650, + 0.8088235294117650, + 0.8088235294117650, + 0.8088235294117650, + 0.7971014492753620, + 0.7826086956521740, + 0.7826086956521740, + 0.7794117647058820, + 0.7794117647058820, + 0.7910447761194030, + 0.8030303030303030, + 0.8030303030303030, + 0.8000000000000000, + 0.7878787878787880, + 0.7878787878787880, + 0.8000000000000000, + 0.7936507936507940, + 0.7777777777777780, + 0.7580645161290320, + 0.7500000000000000, + 0.7500000000000000, + 0.7457627118644070, + 0.7096774193548390, + 0.7166666666666670, + 0.7213114754098360, + 0.7213114754098360, + 0.7213114754098360, + 0.7213114754098360, + 0.7213114754098360, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7142857142857140, + 0.7142857142857140, + 0.6984126984126980, + 0.7031250000000000, + 0.7031250000000000, + 0.7031250000000000, + 0.7031250000000000, + 0.7031250000000000, + 0.7031250000000000, + 0.7031250000000000, + 0.7076923076923080, + 0.7076923076923080, + 0.7076923076923080, + 0.7076923076923080, + 0.7076923076923080, + 0.7031250000000000, + 0.7031250000000000, + 0.7031250000000000, + 0.6923076923076920, + 0.7031250000000000, + 0.6984126984126980, + 0.7031250000000000, + 0.6984126984126980, + 0.6984126984126980, + 0.7096774193548390, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6984126984126980, + 0.6935483870967740, + 0.6825396825396830, + 0.6825396825396830, + 0.6984126984126980, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7096774193548390, + 0.7213114754098360, + 0.7540983606557380, + 0.7540983606557380, + 0.7500000000000000, + 0.7500000000000000, + 0.7758620689655170, + 0.7931034482758620, + 0.8000000000000000, + 0.8000000000000000, + 0.8064516129032260, + 0.8196721311475410, + 0.8253968253968250, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8412698412698410, + 0.8437500000000000, + 0.8437500000000000, + 0.8437500000000000, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8524590163934430, + 0.8524590163934430, + 0.8500000000000000, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8500000000000000, + 0.8524590163934430, + 0.8524590163934430, + 0.8524590163934430, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8548387096774190, + 0.8412698412698410, + 0.8437500000000000, + 0.8437500000000000, + 0.8437500000000000, + 0.8307692307692310, + 0.8307692307692310, + 0.8307692307692310, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8281250000000000, + 0.8307692307692310, + 0.8307692307692310, + 0.8307692307692310, + 0.8307692307692310, + 0.8307692307692310, + 0.8307692307692310, + 0.8307692307692310, + 0.8181818181818180, + 0.8181818181818180, + 0.8153846153846150, + 0.8153846153846150, + 0.8281250000000000, + 0.8281250000000000, + 0.8225806451612900, + 0.8225806451612900, + 0.8095238095238100, + 0.8095238095238100, + 0.8225806451612900, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8360655737704920, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8500000000000000, + 0.8474576271186440, + 0.8500000000000000, + 0.8500000000000000, + 0.8333333333333330, + 0.8333333333333330, + 0.8500000000000000, + 0.8524590163934430, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8387096774193550, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8412698412698410, + 0.8387096774193550, + 0.8225806451612900, + 0.8225806451612900, + 0.8225806451612900, + 0.8225806451612900, + 0.8225806451612900, + 0.8253968253968250, + 0.8253968253968250, + 0.8253968253968250, + 0.8253968253968250, + 0.8253968253968250, + 0.8253968253968250, + 0.8253968253968250, + 0.8095238095238100, + 0.8225806451612900, + 0.8196721311475410, + 0.8166666666666670, + 0.8166666666666670, + 0.8166666666666670, + 0.8166666666666670, + 0.8166666666666670, + 0.8135593220338980, + 0.8135593220338980, + 0.7966101694915250, + 0.7868852459016390, + 0.7741935483870970, + 0.7741935483870970, + 0.7741935483870970, + 0.7741935483870970, + 0.7777777777777780, + 0.7777777777777780, + 0.7741935483870970, + 0.7741935483870970, + 0.7777777777777780, + 0.7741935483870970, + 0.7741935483870970, + 0.7868852459016390, + 0.7868852459016390, + 0.7741935483870970, + 0.7704918032786880, + 0.7580645161290320, + 0.7666666666666670, + 0.7540983606557380, + 0.7540983606557380, + 0.7540983606557380, + 0.7500000000000000, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7377049180327870, + 0.7258064516129030, + 0.7142857142857140, + 0.7096774193548390, + 0.7049180327868850, + 0.7049180327868850, + 0.7166666666666670, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7118644067796610, + 0.7241379310344830, + 0.7118644067796610, + 0.7000000000000000, + 0.6885245901639340, + 0.7000000000000000, + 0.7000000000000000, + 0.6949152542372880, + 0.6949152542372880, + 0.6949152542372880, + 0.6949152542372880, + 0.7068965517241380, + 0.6949152542372880, + 0.6896551724137930, + 0.7017543859649120, + 0.7017543859649120, + 0.7017543859649120, + 0.6779661016949150, + 0.6666666666666670, + 0.6610169491525420, + 0.6610169491525420, + 0.6610169491525420, + 0.6610169491525420, + 0.6500000000000000, + 0.6500000000000000, + 0.6440677966101690, + 0.6440677966101690, + 0.6428571428571430, + 0.6428571428571430, + 0.6428571428571430, + 0.6428571428571430, + 0.6315789473684210, + 0.6206896551724140, + 0.6206896551724140, + 0.6034482758620690, + 0.6034482758620690, + 0.6034482758620690, + 0.6034482758620690, + 0.6034482758620690, + 0.6140350877192980, + 0.6140350877192980, + 0.6071428571428570, + 0.6071428571428570, + 0.6071428571428570, + 0.5964912280701750, + 0.5862068965517240, + 0.5862068965517240, + 0.5862068965517240, + 0.5862068965517240, + 0.5964912280701750, + 0.6181818181818180, + 0.5964912280701750, + 0.5964912280701750, + 0.5964912280701750, + 0.5892857142857140, + 0.5689655172413790, + 0.5614035087719300, + 0.5614035087719300, + 0.5535714285714290, + 0.5555555555555560, + 0.5555555555555560, + 0.5555555555555560, + 0.5636363636363640, + 0.5636363636363640, + 0.5636363636363640, + 0.5636363636363640, + 0.5636363636363640, + 0.5636363636363640, + 0.5740740740740740, + 0.5740740740740740, + 0.5740740740740740, + 0.5740740740740740, + 0.5740740740740740, + 0.5576923076923080, + 0.5576923076923080, + 0.5490196078431370, + 0.5490196078431370, + 0.5600000000000000, + 0.5400000000000000, + 0.5400000000000000, + 0.5400000000000000, + 0.5400000000000000, + 0.5400000000000000, + 0.5400000000000000, + 0.5400000000000000, + 0.5192307692307690, + 0.5192307692307690, + 0.5192307692307690, + 0.4905660377358490, + 0.4905660377358490, + 0.4905660377358490, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.4814814814814810, + 0.4561403508771930, + 0.4561403508771930, + 0.4363636363636360, + 0.4363636363636360, + 0.4363636363636360, + 0.4259259259259260, + 0.3962264150943400, + 0.3962264150943400, + 0.3846153846153850, + 0.3846153846153850, + 0.3846153846153850, + 0.3921568627450980, + 0.3921568627450980, + 0.3773584905660380, + 0.3333333333333330, + 0.3148148148148150, + 0.3018867924528300, + 0.2962962962962960, + 0.3018867924528300, + 0.3018867924528300, + 0.3018867924528300, + 0.3018867924528300, + 0.3076923076923080, + 0.3137254901960780, + 0.3137254901960780, + 0.3137254901960780, + 0.2857142857142860, + 0.2857142857142860, + 0.2800000000000000, + 0.2745098039215690, + 0.2692307692307690, + 0.2745098039215690, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2549019607843140, + 0.2500000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1960784313725490, + 0.1923076923076920, + 0.1923076923076920, + 0.1923076923076920, + 0.1923076923076920, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1923076923076920, + 0.1923076923076920, + 0.1960784313725490, + 0.1960784313725490, + 0.1960784313725490, + 0.2000000000000000, + 0.1923076923076920, + 0.1960784313725490, + 0.1800000000000000, + 0.1800000000000000, + 0.1764705882352940, + 0.1800000000000000, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1698113207547170, + 0.1851851851851850, + 0.1851851851851850, + 0.1886792452830190, + 0.1851851851851850, + 0.1886792452830190, + 0.1886792452830190, + 0.1923076923076920, + 0.1923076923076920, + 0.1886792452830190, + 0.1886792452830190, + 0.1764705882352940, + 0.1600000000000000, + 0.1538461538461540, + 0.1481481481481480, + 0.1538461538461540, + 0.1538461538461540, + 0.1509433962264150, + 0.1346153846153850, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1153846153846150, + 0.1153846153846150, + 0.1176470588235290, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0925925925925926, + 0.0925925925925926, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0877192982456140, + 0.0877192982456140, + 0.0847457627118644, + 0.0819672131147541, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0727272727272727, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0166666666666667, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0166666666666667, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0322580645161290, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0491803278688525, + 0.0500000000000000, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1052631578947370, + 0.1052631578947370, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1111111111111110, + 0.1132075471698110, + 0.1153846153846150, + 0.1176470588235290, + 0.1176470588235290, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1509433962264150, + 0.1509433962264150, + 0.1666666666666670, + 0.1666666666666670, + 0.1818181818181820, + 0.1851851851851850, + 0.2280701754385960, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2413793103448280, + 0.2500000000000000, + 0.2545454545454540, + 0.2592592592592590, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2452830188679250, + 0.2592592592592590, + 0.2592592592592590, + 0.2592592592592590, + 0.2592592592592590, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2909090909090910, + 0.2909090909090910, + 0.2962962962962960, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3090909090909090, + 0.3148148148148150, + 0.3148148148148150, + 0.3148148148148150, + 0.3207547169811320, + 0.3333333333333330, + 0.3333333333333330, + 0.3396226415094340, + 0.3396226415094340, + 0.3518518518518520, + 0.3584905660377360, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3818181818181820, + 0.3818181818181820, + 0.4074074074074070, + 0.4074074074074070, + 0.4074074074074070, + 0.4074074074074070, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4259259259259260, + 0.4150943396226420, + 0.4230769230769230, + 0.4230769230769230, + 0.4230769230769230, + 0.4230769230769230, + 0.4313725490196080, + 0.4423076923076920, + 0.4509803921568630, + 0.4509803921568630, + 0.4509803921568630, + 0.4509803921568630, + 0.4693877551020410, + 0.4693877551020410, + 0.4791666666666670, + 0.4791666666666670, + 0.4791666666666670, + 0.4893617021276600, + 0.5000000000000000, + 0.5000000000000000, + 0.5111111111111110, + 0.5111111111111110, + 0.5217391304347830, + 0.5217391304347830, + 0.5217391304347830, + 0.5333333333333330, + 0.5581395348837210, + 0.5581395348837210, + 0.5681818181818180, + 0.5777777777777780, + 0.5652173913043480, + 0.5531914893617020, + 0.5777777777777780, + 0.5777777777777780, + 0.5909090909090910, + 0.6000000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.6250000000000000, + 0.6250000000000000, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6382978723404260, + 0.6521739130434780, + 0.6739130434782610, + 0.6888888888888890, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7083333333333330, + 0.7200000000000000, + 0.7346938775510200, + 0.7450980392156860, + 0.7450980392156860, + 0.7450980392156860, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7592592592592590, + 0.7454545454545450, + 0.7592592592592590, + 0.7592592592592590, + 0.7678571428571430, + 0.7678571428571430, + 0.7678571428571430, + 0.7543859649122810, + 0.7719298245614030, + 0.7719298245614030, + 0.7758620689655170, + 0.7758620689655170, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7796610169491530, + 0.7758620689655170, + 0.7758620689655170, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7894736842105260, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.7931034482758620, + 0.8070175438596490, + 0.8214285714285710, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8245614035087720, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8392857142857140, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8518518518518520, + 0.8518518518518520, + 0.8518518518518520, + 0.8363636363636360, + 0.8545454545454550, + 0.8571428571428570, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8571428571428570, + 0.8571428571428570, + 0.8545454545454550, + 0.8545454545454550, + 0.8545454545454550, + 0.8571428571428570, + 0.8596491228070170, + 0.8596491228070170, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8793103448275860, + 0.8771929824561400, + 0.8771929824561400, + 0.8793103448275860, + 0.8793103448275860, + 0.8793103448275860, + 0.8793103448275860, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8813559322033900, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8448275862068960, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8392857142857140, + 0.8333333333333330, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8301886792452830, + 0.8235294117647060, + 0.8235294117647060, + 0.8269230769230770, + 0.8269230769230770, + 0.8431372549019610, + 0.8431372549019610, + 0.8490566037735850, + 0.8490566037735850, + 0.8518518518518520, + 0.8518518518518520, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8571428571428570, + 0.8545454545454550, + 0.8545454545454550, + 0.8596491228070170, + 0.8596491228070170, + 0.8571428571428570, + 0.8571428571428570, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8545454545454550, + 0.8545454545454550, + 0.8518518518518520, + 0.8518518518518520, + 0.8545454545454550, + 0.8596491228070170, + 0.8596491228070170, + 0.8596491228070170, + 0.8620689655172410, + 0.8620689655172410, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8666666666666670, + 0.8813559322033900, + 0.8793103448275860, + 0.8793103448275860, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8793103448275860, + 0.8771929824561400, + 0.8771929824561400, + 0.8620689655172410, + 0.8644067796610170, + 0.8644067796610170, + 0.8644067796610170, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8771929824561400, + 0.8750000000000000, + 0.8771929824561400, + 0.8620689655172410, + 0.8620689655172410, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8474576271186440, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8750000000000000, + 0.8771929824561400, + 0.8771929824561400, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8620689655172410, + 0.8474576271186440, + 0.8474576271186440, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8448275862068960, + 0.8421052631578950, + 0.8421052631578950, + 0.8421052631578950, + 0.8448275862068960, + 0.8448275862068960, + 0.8571428571428570, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8727272727272730, + 0.8703703703703700, + 0.8867924528301890, + 0.8867924528301890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8888888888888890, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8703703703703700, + 0.8679245283018870, + 0.8679245283018870, + 0.8703703703703700, + 0.8518518518518520, + 0.8518518518518520, + 0.8518518518518520, + 0.8679245283018870, + 0.8679245283018870, + 0.8653846153846150, + 0.8653846153846150, + 0.8627450980392160, + 0.8600000000000000, + 0.8600000000000000, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8571428571428570, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8600000000000000, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8627450980392160, + 0.8600000000000000, + 0.8775510204081630, + 0.8750000000000000, + 0.8571428571428570, + 0.8400000000000000, + 0.8400000000000000, + 0.8400000000000000, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8235294117647060, + 0.8076923076923080, + 0.7924528301886790, + 0.7924528301886790, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7818181818181820, + 0.7857142857142860, + 0.7857142857142860, + 0.7857142857142860, + 0.7924528301886790, + 0.7924528301886790, + 0.7924528301886790, + 0.7924528301886790, + 0.7924528301886790, + 0.8076923076923080, + 0.7924528301886790, + 0.7924528301886790, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.7962962962962960, + 0.8113207547169810, + 0.7924528301886790, + 0.7924528301886790, + 0.7777777777777780, + 0.7777777777777780, + 0.7636363636363640, + 0.7500000000000000, + 0.7500000000000000, + 0.7500000000000000, + 0.7368421052631580, + 0.7368421052631580, + 0.7368421052631580, + 0.7368421052631580, + 0.7241379310344830, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7192982456140350, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7142857142857140, + 0.7090909090909090, + 0.7090909090909090, + 0.7090909090909090, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.6851851851851850, + 0.6909090909090910, + 0.6909090909090910, + 0.6909090909090910, + 0.6909090909090910, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.7037037037037040, + 0.6981132075471700, + 0.6981132075471700, + 0.6981132075471700, + 0.6923076923076920, + 0.6923076923076920, + 0.6923076923076920, + 0.6923076923076920, + 0.6923076923076920, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6792452830188680, + 0.6730769230769230, + 0.6730769230769230, + 0.6666666666666670, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6538461538461540, + 0.6666666666666670, + 0.6666666666666670, + 0.6666666666666670, + 0.6538461538461540, + 0.6470588235294120, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6346153846153850, + 0.6400000000000000, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6250000000000000, + 0.6326530612244900, + 0.6326530612244900, + 0.6326530612244900, + 0.6250000000000000, + 0.6000000000000000, + 0.6000000000000000, + 0.5882352941176470, + 0.5882352941176470, + 0.5800000000000000, + 0.5600000000000000, + 0.5714285714285710, + 0.5714285714285710, + 0.5714285714285710, + 0.5625000000000000, + 0.5625000000000000, + 0.5625000000000000, + 0.5510204081632650, + 0.5294117647058820, + 0.5294117647058820, + 0.5384615384615380, + 0.5384615384615380, + 0.5384615384615380, + 0.5384615384615380, + 0.5000000000000000, + 0.5000000000000000, + 0.4893617021276600, + 0.4791666666666670, + 0.4680851063829790, + 0.4782608695652170, + 0.4666666666666670, + 0.4666666666666670, + 0.4666666666666670, + 0.4666666666666670, + 0.4565217391304350, + 0.4565217391304350, + 0.4255319148936170, + 0.4130434782608700, + 0.3863636363636360, + 0.3777777777777780, + 0.3636363636363640, + 0.3636363636363640, + 0.3333333333333330, + 0.3488372093023260, + 0.3636363636363640, + 0.3636363636363640, + 0.3488372093023260, + 0.3409090909090910, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3181818181818180, + 0.3255813953488370, + 0.3095238095238100, + 0.3095238095238100, + 0.2926829268292680, + 0.2926829268292680, + 0.2857142857142860, + 0.2857142857142860, + 0.2790697674418600, + 0.2790697674418600, + 0.2727272727272730, + 0.2727272727272730, + 0.2790697674418600, + 0.2790697674418600, + 0.2790697674418600, + 0.2790697674418600, + 0.2790697674418600, + 0.2619047619047620, + 0.2558139534883720, + 0.2558139534883720, + 0.2380952380952380, + 0.2380952380952380, + 0.2272727272727270, + 0.2142857142857140, + 0.2045454545454550, + 0.2000000000000000, + 0.1777777777777780, + 0.1777777777777780, + 0.1702127659574470, + 0.1521739130434780, + 0.1458333333333330, + 0.1458333333333330, + 0.1600000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1568627450980390, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1372549019607840, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1132075471698110, + 0.1153846153846150, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1020408163265310, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1020408163265310, + 0.1020408163265310, + 0.1000000000000000, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1041666666666670, + 0.1041666666666670, + 0.1020408163265310, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0851063829787234, + 0.0851063829787234, + 0.0851063829787234, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0851063829787234, + 0.0851063829787234, + 0.0851063829787234, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0800000000000000, + 0.0784313725490196, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0754716981132075, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0588235294117647, + 0.0588235294117647, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0545454545454545, + 0.0535714285714286, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0363636363636364, + 0.0357142857142857, + 0.0357142857142857, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0370370370370370, + 0.0370370370370370, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0384615384615385, + 0.0392156862745098, + 0.0392156862745098, + 0.0400000000000000, + 0.0400000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0377358490566038, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0377358490566038, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0377358490566038, + 0.0377358490566038, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0185185185185185, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0175438596491228, + 0.0175438596491228, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000 + } + }, + { PLACE_CATEG_ID_OTHER, + { + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0181818181818182, + 0.0181818181818182, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0363636363636364, + 0.0363636363636364, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0526315789473684, + 0.0526315789473684, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0377358490566038, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0196078431372549, + 0.0196078431372549, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0192307692307692, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0188679245283019, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0192307692307692, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0192307692307692, + 0.0200000000000000, + 0.0200000000000000, + 0.0208333333333333, + 0.0212765957446808, + 0.0212765957446808, + 0.0212765957446808, + 0.0212765957446808, + 0.0416666666666667, + 0.0400000000000000, + 0.0392156862745098, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0392156862745098, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0384615384615385, + 0.0384615384615385, + 0.0400000000000000, + 0.0392156862745098, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0408163265306122, + 0.0425531914893617, + 0.0425531914893617, + 0.0425531914893617, + 0.0425531914893617, + 0.0444444444444444, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0425531914893617, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0444444444444444, + 0.0444444444444444, + 0.0444444444444444, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0444444444444444, + 0.0444444444444444, + 0.0465116279069768, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0444444444444444, + 0.0444444444444444, + 0.0444444444444444, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0408163265306122, + 0.0408163265306122, + 0.0400000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0377358490566038, + 0.0377358490566038, + 0.0384615384615385, + 0.0384615384615385, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0370370370370370, + 0.0370370370370370, + 0.0357142857142857, + 0.0357142857142857, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0333333333333333, + 0.0333333333333333, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0500000000000000, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0677966101694915, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0677966101694915, + 0.0677966101694915, + 0.0666666666666667, + 0.0666666666666667, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0655737704918033, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0517241379310345, + 0.0517241379310345, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0517241379310345, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0526315789473684, + 0.0526315789473684, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0727272727272727, + 0.0727272727272727, + 0.0740740740740741, + 0.0740740740740741, + 0.0909090909090909, + 0.0925925925925926, + 0.1090909090909090, + 0.1111111111111110, + 0.1132075471698110, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.0943396226415094, + 0.0943396226415094, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0909090909090909, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1228070175438600, + 0.1206896551724140, + 0.1206896551724140, + 0.1228070175438600, + 0.1071428571428570, + 0.1071428571428570, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.1052631578947370, + 0.1052631578947370, + 0.1052631578947370, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1250000000000000, + 0.0925925925925926, + 0.0925925925925926, + 0.1090909090909090, + 0.1071428571428570, + 0.1090909090909090, + 0.1090909090909090, + 0.1071428571428570, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0877192982456140, + 0.1071428571428570, + 0.1071428571428570, + 0.1228070175438600, + 0.1228070175438600, + 0.1250000000000000, + 0.1250000000000000, + 0.1071428571428570, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1250000000000000, + 0.1250000000000000, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1296296296296300, + 0.1272727272727270, + 0.1272727272727270, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1132075471698110, + 0.1153846153846150, + 0.1153846153846150, + 0.0980392156862745, + 0.1132075471698110, + 0.1153846153846150, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.1153846153846150, + 0.1176470588235290, + 0.1346153846153850, + 0.1346153846153850, + 0.1400000000000000, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1600000000000000, + 0.1836734693877550, + 0.1836734693877550, + 0.1836734693877550, + 0.1632653061224490, + 0.1632653061224490, + 0.1800000000000000, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1956521739130430, + 0.1956521739130430, + 0.1956521739130430, + 0.1956521739130430, + 0.2173913043478260, + 0.2173913043478260, + 0.2127659574468080, + 0.2127659574468080, + 0.2127659574468080, + 0.2040816326530610, + 0.2000000000000000, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1627906976744190, + 0.1627906976744190, + 0.1627906976744190, + 0.1428571428571430, + 0.1428571428571430, + 0.1463414634146340, + 0.1463414634146340, + 0.1860465116279070, + 0.1860465116279070, + 0.2045454545454550, + 0.2093023255813950, + 0.2093023255813950, + 0.2093023255813950, + 0.2272727272727270, + 0.2272727272727270, + 0.2608695652173910, + 0.2608695652173910, + 0.2444444444444440, + 0.2444444444444440, + 0.2954545454545450, + 0.2954545454545450, + 0.3404255319148940, + 0.3333333333333330, + 0.3265306122448980, + 0.3265306122448980, + 0.3200000000000000, + 0.3265306122448980, + 0.3400000000000000, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3269230769230770, + 0.3207547169811320, + 0.3396226415094340, + 0.3396226415094340, + 0.3333333333333330, + 0.3269230769230770, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3148148148148150, + 0.3148148148148150, + 0.3148148148148150, + 0.3090909090909090, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3272727272727270, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3214285714285710, + 0.3148148148148150, + 0.3148148148148150, + 0.3148148148148150, + 0.3148148148148150, + 0.3090909090909090, + 0.3148148148148150, + 0.2127659574468080, + 0.2127659574468080, + 0.2127659574468080, + 0.2127659574468080, + 0.2173913043478260, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1818181818181820, + 0.1818181818181820, + 0.1777777777777780, + 0.1777777777777780, + 0.1777777777777780, + 0.1777777777777780, + 0.1521739130434780, + 0.1521739130434780, + 0.1521739130434780, + 0.1304347826086960, + 0.1304347826086960, + 0.1304347826086960, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1250000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1632653061224490, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1800000000000000, + 0.1800000000000000, + 0.1800000000000000, + 0.1960784313725490, + 0.1960784313725490, + 0.1923076923076920, + 0.1923076923076920, + 0.1923076923076920, + 0.1886792452830190, + 0.1886792452830190, + 0.1730769230769230, + 0.1730769230769230, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1400000000000000, + 0.1400000000000000, + 0.1372549019607840, + 0.1372549019607840, + 0.1538461538461540, + 0.1538461538461540, + 0.1200000000000000, + 0.1200000000000000, + 0.1346153846153850, + 0.1372549019607840, + 0.1372549019607840, + 0.1200000000000000, + 0.0833333333333333, + 0.0833333333333333, + 0.0800000000000000, + 0.0800000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0784313725490196, + 0.0961538461538462, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1153846153846150, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0740740740740741, + 0.0740740740740741, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0862068965517241, + 0.0862068965517241, + 0.0701754385964912, + 0.0689655172413793, + 0.0677966101694915, + 0.0677966101694915, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0689655172413793, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0625000000000000, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0317460317460317, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0172413793103448, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228, + 0.0178571428571429, + 0.0181818181818182, + 0.0357142857142857, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0350877192982456, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0181818181818182, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0181818181818182, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0188679245283019, + 0.0188679245283019, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0181818181818182, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0185185185185185, + 0.0181818181818182, + 0.0185185185185185, + 0.0181818181818182, + 0.0181818181818182, + 0.0185185185185185, + 0.0185185185185185, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0192307692307692, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0200000000000000, + 0.0200000000000000, + 0.0200000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0392156862745098, + 0.0384615384615385, + 0.0566037735849057, + 0.0566037735849057, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0600000000000000, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0588235294117647, + 0.0588235294117647, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0384615384615385, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0392156862745098, + 0.0200000000000000, + 0.0408163265306122, + 0.0408163265306122, + 0.0408163265306122, + 0.0408163265306122, + 0.0416666666666667, + 0.0416666666666667, + 0.0425531914893617, + 0.0425531914893617, + 0.0425531914893617, + 0.0425531914893617, + 0.0425531914893617, + 0.0416666666666667, + 0.0625000000000000, + 0.0612244897959184, + 0.0612244897959184, + 0.0612244897959184, + 0.0600000000000000, + 0.0588235294117647, + 0.0588235294117647, + 0.0600000000000000, + 0.0600000000000000, + 0.0600000000000000, + 0.0638297872340425, + 0.0638297872340425, + 0.0434782608695652, + 0.0444444444444444, + 0.0444444444444444, + 0.0444444444444444, + 0.0444444444444444, + 0.0444444444444444, + 0.0227272727272727, + 0.0217391304347826, + 0.0212765957446808, + 0.0208333333333333, + 0.0204081632653061, + 0.0204081632653061, + 0.0200000000000000, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0196078431372549, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0350877192982456, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0322580645161290, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0312500000000000, + 0.0312500000000000, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0166666666666667, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0476190476190476, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0307692307692308, + 0.0307692307692308, + 0.0307692307692308, + 0.0312500000000000, + 0.0317460317460317, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0312500000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0158730158730159, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0163934426229508, + 0.0163934426229508, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0333333333333333, + 0.0344827586206897, + 0.0350877192982456, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0545454545454545, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0363636363636364, + 0.0370370370370370, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0333333333333333, + 0.0169491525423729, + 0.0169491525423729, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0172413793103448, + 0.0172413793103448, + 0.0175438596491228, + 0.0172413793103448, + 0.0172413793103448, + 0.0175438596491228, + 0.0000000000000000, + 0.0000000000000000, + 0.0169491525423729, + 0.0169491525423729, + 0.0172413793103448, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0163934426229508, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0169491525423729, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0163934426229508, + 0.0166666666666667, + 0.0166666666666667, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0156250000000000, + 0.0156250000000000, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0161290322580645, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0322580645161290, + 0.0322580645161290, + 0.0483870967741936, + 0.0468750000000000, + 0.0476190476190476, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0500000000000000, + 0.0491803278688525, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0327868852459016, + 0.0333333333333333, + 0.0169491525423729, + 0.0169491525423729, + 0.0333333333333333, + 0.0333333333333333, + 0.0645161290322581, + 0.0793650793650794, + 0.0781250000000000, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0781250000000000, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0781250000000000, + 0.0781250000000000, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0923076923076923, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0952380952380952, + 0.0967741935483871, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0847457627118644, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0877192982456140, + 0.0727272727272727, + 0.0892857142857143, + 0.0892857142857143, + 0.0909090909090909, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0576923076923077, + 0.0740740740740741, + 0.0740740740740741, + 0.0909090909090909, + 0.0909090909090909, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1206896551724140, + 0.1206896551724140, + 0.1228070175438600, + 0.1250000000000000, + 0.1090909090909090, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1111111111111110, + 0.1111111111111110, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.1000000000000000, + 0.0816326530612245, + 0.0816326530612245, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0816326530612245, + 0.0816326530612245, + 0.0816326530612245, + 0.0833333333333333, + 0.0833333333333333, + 0.1000000000000000, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1153846153846150, + 0.1111111111111110, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1052631578947370, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.1071428571428570, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0784313725490196, + 0.0769230769230769, + 0.0784313725490196, + 0.0784313725490196, + 0.0769230769230769, + 0.0784313725490196, + 0.0784313725490196, + 0.0784313725490196, + 0.0961538461538462, + 0.0961538461538462, + 0.1132075471698110, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1132075471698110, + 0.1111111111111110, + 0.1111111111111110, + 0.1454545454545450, + 0.1454545454545450, + 0.1538461538461540, + 0.1481481481481480, + 0.1481481481481480, + 0.1481481481481480, + 0.1538461538461540, + 0.1538461538461540, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1276595744680850, + 0.1304347826086960, + 0.1304347826086960, + 0.0888888888888889, + 0.0869565217391304, + 0.0851063829787234, + 0.1041666666666670, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1250000000000000, + 0.1250000000000000, + 0.1224489795918370, + 0.1041666666666670, + 0.1041666666666670, + 0.1041666666666670, + 0.1020408163265310, + 0.1041666666666670, + 0.1063829787234040, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1041666666666670, + 0.1041666666666670, + 0.1020408163265310, + 0.1020408163265310, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.1153846153846150, + 0.1153846153846150, + 0.1132075471698110, + 0.1132075471698110, + 0.1153846153846150, + 0.1153846153846150, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1698113207547170, + 0.1666666666666670, + 0.1509433962264150, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1818181818181820, + 0.1636363636363640, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1754385964912280, + 0.1754385964912280, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1864406779661020, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1833333333333330, + 0.1833333333333330, + 0.1833333333333330, + 0.1967213114754100, + 0.1935483870967740, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1774193548387100, + 0.1774193548387100, + 0.1774193548387100, + 0.1500000000000000, + 0.1500000000000000, + 0.1500000000000000, + 0.1500000000000000, + 0.1666666666666670, + 0.1525423728813560, + 0.1071428571428570, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1403508771929820, + 0.1403508771929820, + 0.1403508771929820, + 0.1403508771929820, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1724137931034480, + 0.1724137931034480, + 0.1694915254237290, + 0.1666666666666670, + 0.1639344262295080, + 0.1500000000000000, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1475409836065570, + 0.1475409836065570, + 0.1612903225806450, + 0.1612903225806450, + 0.1587301587301590, + 0.1692307692307690, + 0.1692307692307690, + 0.1692307692307690, + 0.1692307692307690, + 0.1562500000000000, + 0.1562500000000000, + 0.1562500000000000, + 0.1692307692307690, + 0.1692307692307690, + 0.1692307692307690, + 0.1692307692307690, + 0.1538461538461540, + 0.1538461538461540, + 0.1538461538461540, + 0.1538461538461540, + 0.1406250000000000, + 0.1290322580645160, + 0.1290322580645160, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0862068965517241, + 0.0862068965517241, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0781250000000000, + 0.0781250000000000, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0952380952380952, + 0.0793650793650794, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0597014925373134, + 0.0588235294117647, + 0.0588235294117647, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0285714285714286, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0156250000000000, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0153846153846154, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0491803278688525, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0169491525423729, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0161290322580645, + 0.0163934426229508, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0169491525423729, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0169491525423729, + 0.0166666666666667, + 0.0163934426229508, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0166666666666667, + 0.0169491525423729, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0163934426229508, + 0.0166666666666667, + 0.0172413793103448, + 0.0172413793103448, + 0.0172413793103448, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0181818181818182, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0178571428571429, + 0.0181818181818182, + 0.0185185185185185, + 0.0188679245283019, + 0.0188679245283019, + 0.0188679245283019, + 0.0192307692307692, + 0.0196078431372549, + 0.0204081632653061, + 0.0200000000000000, + 0.0200000000000000, + 0.0392156862745098, + 0.0400000000000000, + 0.0392156862745098, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0384615384615385, + 0.0392156862745098, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0566037735849057, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0535714285714286, + 0.0535714285714286, + 0.0526315789473684, + 0.0517241379310345, + 0.0545454545454545, + 0.0545454545454545, + 0.0363636363636364, + 0.0363636363636364, + 0.0357142857142857, + 0.0357142857142857, + 0.0363636363636364, + 0.0357142857142857, + 0.0357142857142857, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0370370370370370, + 0.0363636363636364, + 0.0363636363636364, + 0.0370370370370370, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0370370370370370, + 0.0392156862745098, + 0.0392156862745098, + 0.0400000000000000, + 0.0408163265306122, + 0.0408163265306122, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0384615384615385, + 0.0384615384615385, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0555555555555556, + 0.0555555555555556, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0312500000000000, + 0.0312500000000000, + 0.0307692307692308, + 0.0307692307692308, + 0.0312500000000000, + 0.0312500000000000, + 0.0307692307692308, + 0.0307692307692308, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0294117647058823, + 0.0289855072463768, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0285714285714286, + 0.0281690140845070, + 0.0285714285714286, + 0.0285714285714286, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0294117647058823, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0303030303030303, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0144927536231884, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0144927536231884, + 0.0147058823529412, + 0.0144927536231884, + 0.0147058823529412, + 0.0149253731343284, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0151515151515152, + 0.0156250000000000, + 0.0153846153846154, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0158730158730159, + 0.0461538461538462, + 0.0468750000000000, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0781250000000000, + 0.0781250000000000, + 0.0769230769230769, + 0.0769230769230769, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.1093750000000000, + 0.0967741935483871, + 0.0967741935483871, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0819672131147541, + 0.0666666666666667, + 0.0645161290322581, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0757575757575758, + 0.0724637681159420, + 0.0724637681159420, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0704225352112676, + 0.0704225352112676, + 0.0571428571428571, + 0.0579710144927536, + 0.0441176470588235, + 0.0441176470588235, + 0.0447761194029851, + 0.0454545454545455, + 0.0447761194029851, + 0.0441176470588235, + 0.0434782608695652, + 0.0428571428571429, + 0.0428571428571429, + 0.0434782608695652, + 0.0434782608695652, + 0.0434782608695652, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0294117647058823, + 0.0294117647058823, + 0.0298507462686567, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0289855072463768, + 0.0289855072463768, + 0.0285714285714286, + 0.0142857142857143, + 0.0142857142857143, + 0.0140845070422535, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0136986301369863, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0138888888888889, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0000000000000000, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0142857142857143, + 0.0281690140845070, + 0.0285714285714286, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0285714285714286, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0298507462686567, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0147058823529412, + 0.0147058823529412, + 0.0144927536231884, + 0.0147058823529412, + 0.0144927536231884, + 0.0142857142857143, + 0.0142857142857143, + 0.0140845070422535, + 0.0140845070422535, + 0.0142857142857143, + 0.0144927536231884, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0149253731343284, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0147058823529412, + 0.0289855072463768, + 0.0289855072463768, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0289855072463768, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0294117647058823, + 0.0298507462686567, + 0.0303030303030303, + 0.0447761194029851, + 0.0447761194029851, + 0.0454545454545455, + 0.0597014925373134, + 0.0597014925373134, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0441176470588235, + 0.0447761194029851, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0461538461538462, + 0.0461538461538462, + 0.0454545454545455, + 0.0454545454545455, + 0.0447761194029851, + 0.0447761194029851, + 0.0454545454545455, + 0.0468750000000000, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0476190476190476, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0491803278688525, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0491803278688525, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0526315789473684, + 0.0545454545454545, + 0.0526315789473684, + 0.0526315789473684, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0727272727272727, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0545454545454545, + 0.0555555555555556, + 0.0566037735849057, + 0.0384615384615385, + 0.0384615384615385, + 0.0384615384615385, + 0.0377358490566038, + 0.0377358490566038, + 0.0377358490566038, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0612244897959184, + 0.0625000000000000, + 0.0625000000000000, + 0.0612244897959184, + 0.0961538461538462, + 0.1111111111111110, + 0.1578947368421050, + 0.1551724137931030, + 0.1724137931034480, + 0.1694915254237290, + 0.1666666666666670, + 0.1666666666666670, + 0.2000000000000000, + 0.1864406779661020, + 0.1864406779661020, + 0.1864406779661020, + 0.1896551724137930, + 0.1896551724137930, + 0.2033898305084750, + 0.2033898305084750, + 0.2033898305084750, + 0.2000000000000000, + 0.1967213114754100, + 0.1967213114754100, + 0.1935483870967740, + 0.1935483870967740, + 0.2187500000000000, + 0.2187500000000000, + 0.2187500000000000, + 0.2187500000000000, + 0.2187500000000000, + 0.2307692307692310, + 0.2307692307692310, + 0.2380952380952380, + 0.2419354838709680, + 0.2459016393442620, + 0.2586206896551720, + 0.2586206896551720, + 0.2711864406779660, + 0.2711864406779660, + 0.2711864406779660, + 0.2711864406779660, + 0.2622950819672130, + 0.2580645161290320, + 0.2542372881355930, + 0.2542372881355930, + 0.2542372881355930, + 0.2500000000000000, + 0.2459016393442620, + 0.2459016393442620, + 0.2459016393442620, + 0.2459016393442620, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2622950819672130, + 0.2622950819672130, + 0.2622950819672130, + 0.2666666666666670, + 0.2711864406779660, + 0.2711864406779660, + 0.2833333333333330, + 0.2833333333333330, + 0.2786885245901640, + 0.2741935483870970, + 0.2615384615384620, + 0.2656250000000000, + 0.2539682539682540, + 0.2539682539682540, + 0.2539682539682540, + 0.2622950819672130, + 0.2666666666666670, + 0.2622950819672130, + 0.2500000000000000, + 0.2500000000000000, + 0.2459016393442620, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2500000000000000, + 0.2615384615384620, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2769230769230770, + 0.2769230769230770, + 0.2769230769230770, + 0.2727272727272730, + 0.2647058823529410, + 0.2647058823529410, + 0.2537313432835820, + 0.2647058823529410, + 0.2647058823529410, + 0.2647058823529410, + 0.2424242424242420, + 0.2424242424242420, + 0.2153846153846150, + 0.2153846153846150, + 0.2153846153846150, + 0.2153846153846150, + 0.1774193548387100, + 0.1774193548387100, + 0.1774193548387100, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1428571428571430, + 0.1428571428571430, + 0.1578947368421050, + 0.1428571428571430, + 0.1428571428571430, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1296296296296300, + 0.1296296296296300, + 0.1481481481481480, + 0.1481481481481480, + 0.1509433962264150, + 0.1666666666666670, + 0.1509433962264150, + 0.1886792452830190, + 0.2000000000000000, + 0.2037037037037040, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1929824561403510, + 0.1785714285714290, + 0.1818181818181820, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1724137931034480, + 0.1724137931034480, + 0.1694915254237290, + 0.1694915254237290, + 0.1666666666666670, + 0.1666666666666670, + 0.1500000000000000, + 0.1500000000000000, + 0.1500000000000000, + 0.1500000000000000, + 0.1525423728813560, + 0.1525423728813560, + 0.1379310344827590, + 0.1379310344827590, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1525423728813560, + 0.1525423728813560, + 0.1525423728813560, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1666666666666670, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1803278688524590, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.2000000000000000, + 0.2000000000000000, + 0.1969696969696970, + 0.1969696969696970, + 0.2000000000000000, + 0.2000000000000000, + 0.2121212121212120, + 0.2121212121212120, + 0.2238805970149250, + 0.2238805970149250, + 0.2238805970149250, + 0.2205882352941180, + 0.2205882352941180, + 0.2205882352941180, + 0.2205882352941180, + 0.2089552238805970, + 0.2058823529411760, + 0.2058823529411760, + 0.1940298507462690, + 0.1940298507462690, + 0.1940298507462690, + 0.1940298507462690, + 0.1940298507462690, + 0.1940298507462690, + 0.1884057971014490, + 0.1884057971014490, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1641791044776120, + 0.1641791044776120, + 0.1515151515151520, + 0.1492537313432840, + 0.1492537313432840, + 0.1470588235294120, + 0.1449275362318840, + 0.1449275362318840, + 0.1449275362318840, + 0.1449275362318840, + 0.1449275362318840, + 0.1449275362318840, + 0.1304347826086960, + 0.1323529411764710, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1343283582089550, + 0.1212121212121210, + 0.1230769230769230, + 0.1230769230769230, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1230769230769230, + 0.1230769230769230, + 0.1212121212121210, + 0.1212121212121210, + 0.1212121212121210, + 0.1212121212121210, + 0.1194029850746270, + 0.1142857142857140, + 0.1142857142857140, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1044776119402990, + 0.1060606060606060, + 0.1060606060606060, + 0.1060606060606060, + 0.1060606060606060, + 0.1060606060606060, + 0.1060606060606060, + 0.1044776119402990, + 0.1044776119402990, + 0.1014492753623190, + 0.1014492753623190, + 0.1014492753623190, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1060606060606060, + 0.1060606060606060, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.1076923076923080, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0857142857142857, + 0.0857142857142857, + 0.0845070422535211, + 0.0845070422535211, + 0.0845070422535211, + 0.0845070422535211, + 0.0845070422535211, + 0.0845070422535211, + 0.0845070422535211, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0704225352112676, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0694444444444444, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0563380281690141, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0547945205479452, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0540540540540541, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0405405405405405, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0410958904109589, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0416666666666667, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0422535211267606, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0428571428571429, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0454545454545455, + 0.0461538461538462, + 0.0461538461538462, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0468750000000000, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0317460317460317, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0333333333333333, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0333333333333333, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0327868852459016, + 0.0322580645161290, + 0.0327868852459016, + 0.0322580645161290, + 0.0327868852459016, + 0.0327868852459016, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0344827586206897, + 0.0344827586206897, + 0.0350877192982456, + 0.0357142857142857, + 0.0357142857142857, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0338983050847458, + 0.0344827586206897, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0333333333333333, + 0.0338983050847458, + 0.0338983050847458, + 0.0338983050847458, + 0.0333333333333333, + 0.0491803278688525, + 0.0491803278688525, + 0.0526315789473684, + 0.0517241379310345, + 0.0508474576271187, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0545454545454545, + 0.0545454545454545, + 0.0566037735849057, + 0.0555555555555556, + 0.0727272727272727, + 0.0727272727272727, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0740740740740741, + 0.0740740740740741, + 0.0754716981132075, + 0.0784313725490196, + 0.0600000000000000, + 0.0612244897959184, + 0.0600000000000000, + 0.0600000000000000, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0566037735849057, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0483870967741936, + 0.0483870967741936, + 0.0483870967741936, + 0.0491803278688525, + 0.0645161290322581, + 0.0645161290322581, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0634920634920635, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0606060606060606, + 0.0606060606060606, + 0.0606060606060606, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0588235294117647, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0597014925373134, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0441176470588235, + 0.0447761194029851, + 0.0447761194029851, + 0.0447761194029851, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0597014925373134, + 0.0454545454545455, + 0.0461538461538462, + 0.0461538461538462, + 0.0461538461538462, + 0.0606060606060606, + 0.0606060606060606, + 0.0597014925373134, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0724637681159420, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0735294117647059, + 0.0597014925373134, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0579710144927536, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0571428571428571, + 0.0579710144927536, + 0.0579710144927536, + 0.0579710144927536, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0735294117647059, + 0.0606060606060606, + 0.0615384615384615, + 0.0615384615384615, + 0.0615384615384615, + 0.0625000000000000, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1029411764705880, + 0.1014492753623190, + 0.1159420289855070, + 0.1159420289855070, + 0.1176470588235290, + 0.1176470588235290, + 0.1194029850746270, + 0.1060606060606060, + 0.1060606060606060, + 0.1076923076923080, + 0.1212121212121210, + 0.1212121212121210, + 0.1076923076923080, + 0.1111111111111110, + 0.1269841269841270, + 0.1451612903225810, + 0.1500000000000000, + 0.1500000000000000, + 0.1525423728813560, + 0.1935483870967740, + 0.2000000000000000, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.1967213114754100, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1904761904761900, + 0.1904761904761900, + 0.1904761904761900, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1846153846153850, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.2000000000000000, + 0.1875000000000000, + 0.1904761904761900, + 0.1875000000000000, + 0.1904761904761900, + 0.1904761904761900, + 0.1935483870967740, + 0.2063492063492060, + 0.2063492063492060, + 0.2063492063492060, + 0.2063492063492060, + 0.2096774193548390, + 0.2222222222222220, + 0.2222222222222220, + 0.2063492063492060, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1935483870967740, + 0.1803278688524590, + 0.1639344262295080, + 0.1639344262295080, + 0.1666666666666670, + 0.1666666666666670, + 0.1379310344827590, + 0.1206896551724140, + 0.1166666666666670, + 0.1166666666666670, + 0.1129032258064520, + 0.0983606557377049, + 0.0952380952380952, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0793650793650794, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0645161290322581, + 0.0793650793650794, + 0.0781250000000000, + 0.0781250000000000, + 0.0781250000000000, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0937500000000000, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.0923076923076923, + 0.1060606060606060, + 0.1060606060606060, + 0.1076923076923080, + 0.1076923076923080, + 0.0937500000000000, + 0.0937500000000000, + 0.0967741935483871, + 0.0967741935483871, + 0.1111111111111110, + 0.1111111111111110, + 0.0967741935483871, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0833333333333333, + 0.0833333333333333, + 0.1000000000000000, + 0.1000000000000000, + 0.0833333333333333, + 0.0819672131147541, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0806451612903226, + 0.0819672131147541, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0983606557377049, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0952380952380952, + 0.0952380952380952, + 0.0967741935483871, + 0.0967741935483871, + 0.0952380952380952, + 0.0967741935483871, + 0.0967741935483871, + 0.0819672131147541, + 0.0819672131147541, + 0.0967741935483871, + 0.0983606557377049, + 0.0967741935483871, + 0.1000000000000000, + 0.1147540983606560, + 0.0983606557377049, + 0.0983606557377049, + 0.1000000000000000, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0967741935483871, + 0.0952380952380952, + 0.0967741935483871, + 0.0983606557377049, + 0.0983606557377049, + 0.1000000000000000, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.1016949152542370, + 0.0862068965517241, + 0.0847457627118644, + 0.1000000000000000, + 0.1147540983606560, + 0.1166666666666670, + 0.1166666666666670, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1186440677966100, + 0.1206896551724140, + 0.1186440677966100, + 0.1206896551724140, + 0.1228070175438600, + 0.1228070175438600, + 0.1228070175438600, + 0.1525423728813560, + 0.1500000000000000, + 0.1525423728813560, + 0.1525423728813560, + 0.1525423728813560, + 0.1525423728813560, + 0.1666666666666670, + 0.1666666666666670, + 0.1694915254237290, + 0.1694915254237290, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1578947368421050, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1578947368421050, + 0.1578947368421050, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1754385964912280, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1754385964912280, + 0.1818181818181820, + 0.2105263157894740, + 0.2105263157894740, + 0.2105263157894740, + 0.2142857142857140, + 0.2068965517241380, + 0.2105263157894740, + 0.2105263157894740, + 0.2142857142857140, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2115384615384620, + 0.2115384615384620, + 0.2156862745098040, + 0.2156862745098040, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1800000000000000, + 0.1800000000000000, + 0.1923076923076920, + 0.1923076923076920, + 0.1923076923076920, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2456140350877190, + 0.2456140350877190, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2592592592592590, + 0.2641509433962260, + 0.2641509433962260, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2549019607843140, + 0.2549019607843140, + 0.2641509433962260, + 0.2777777777777780, + 0.2962962962962960, + 0.3018867924528300, + 0.3148148148148150, + 0.3018867924528300, + 0.3018867924528300, + 0.3018867924528300, + 0.3018867924528300, + 0.2884615384615380, + 0.2745098039215690, + 0.2745098039215690, + 0.2745098039215690, + 0.2857142857142860, + 0.2857142857142860, + 0.3000000000000000, + 0.3137254901960780, + 0.3076923076923080, + 0.3137254901960780, + 0.3200000000000000, + 0.3200000000000000, + 0.3200000000000000, + 0.3200000000000000, + 0.3137254901960780, + 0.3269230769230770, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3529411764705880, + 0.3461538461538460, + 0.3461538461538460, + 0.3269230769230770, + 0.3269230769230770, + 0.3333333333333330, + 0.3333333333333330, + 0.3137254901960780, + 0.3137254901960780, + 0.3076923076923080, + 0.2884615384615380, + 0.2745098039215690, + 0.2549019607843140, + 0.2549019607843140, + 0.2400000000000000, + 0.2500000000000000, + 0.2352941176470590, + 0.2400000000000000, + 0.2400000000000000, + 0.2352941176470590, + 0.2200000000000000, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2075471698113210, + 0.1851851851851850, + 0.1851851851851850, + 0.1698113207547170, + 0.1666666666666670, + 0.1698113207547170, + 0.1698113207547170, + 0.1538461538461540, + 0.1538461538461540, + 0.1509433962264150, + 0.1509433962264150, + 0.1568627450980390, + 0.1600000000000000, + 0.1730769230769230, + 0.1851851851851850, + 0.1538461538461540, + 0.1538461538461540, + 0.1698113207547170, + 0.1730769230769230, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1730769230769230, + 0.1730769230769230, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1851851851851850, + 0.1851851851851850, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.1851851851851850, + 0.2000000000000000, + 0.1851851851851850, + 0.1851851851851850, + 0.2105263157894740, + 0.2105263157894740, + 0.2372881355932200, + 0.2295081967213110, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2096774193548390, + 0.2096774193548390, + 0.2096774193548390, + 0.2063492063492060, + 0.2063492063492060, + 0.2096774193548390, + 0.2096774193548390, + 0.2222222222222220, + 0.2295081967213110, + 0.2295081967213110, + 0.2295081967213110, + 0.2166666666666670, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2419354838709680, + 0.2459016393442620, + 0.2622950819672130, + 0.2622950819672130, + 0.2500000000000000, + 0.2372881355932200, + 0.2372881355932200, + 0.2372881355932200, + 0.2372881355932200, + 0.2372881355932200, + 0.2000000000000000, + 0.2280701754385960, + 0.2280701754385960, + 0.2241379310344830, + 0.2241379310344830, + 0.2105263157894740, + 0.2105263157894740, + 0.2105263157894740, + 0.2105263157894740, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1964285714285710, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1754385964912280, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1403508771929820, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1379310344827590, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1694915254237290, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1774193548387100, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1746031746031750, + 0.1774193548387100, + 0.1774193548387100, + 0.1774193548387100, + 0.1774193548387100, + 0.1774193548387100, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1639344262295080, + 0.1639344262295080, + 0.1639344262295080, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1587301587301590, + 0.1639344262295080, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1612903225806450, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1500000000000000, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1475409836065570, + 0.1500000000000000, + 0.1475409836065570, + 0.1475409836065570, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1311475409836070, + 0.1311475409836070, + 0.1311475409836070, + 0.1311475409836070, + 0.1311475409836070, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1129032258064520, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1166666666666670, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1129032258064520, + 0.1129032258064520, + 0.1269841269841270, + 0.1269841269841270, + 0.1269841269841270, + 0.1269841269841270, + 0.1290322580645160, + 0.1290322580645160, + 0.1290322580645160, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1147540983606560, + 0.1000000000000000, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0983606557377049, + 0.0967741935483871, + 0.0967741935483871, + 0.0967741935483871, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0952380952380952, + 0.0937500000000000, + 0.0937500000000000, + 0.0923076923076923, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0895522388059701, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0746268656716418, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0757575757575758, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0769230769230769, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0793650793650794, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0806451612903226, + 0.0645161290322581, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0655737704918033, + 0.0666666666666667, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0655737704918033, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0877192982456140, + 0.0877192982456140, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0943396226415094, + 0.0961538461538462, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0925925925925926, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0892857142857143, + 0.0909090909090909, + 0.0925925925925926, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0943396226415094, + 0.0925925925925926, + 0.0925925925925926, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0943396226415094, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0925925925925926, + 0.0943396226415094, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0980392156862745, + 0.0961538461538462, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0816326530612245, + 0.0816326530612245, + 0.0833333333333333, + 0.0833333333333333, + 0.0833333333333333, + 0.0851063829787234, + 0.0652173913043478, + 0.0652173913043478, + 0.0666666666666667, + 0.0666666666666667, + 0.0652173913043478, + 0.0652173913043478, + 0.0652173913043478, + 0.0666666666666667, + 0.0697674418604651, + 0.0697674418604651, + 0.0681818181818182, + 0.0666666666666667, + 0.0869565217391304, + 0.1063829787234040, + 0.1111111111111110, + 0.1111111111111110, + 0.1136363636363640, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1041666666666670, + 0.1041666666666670, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1086956521739130, + 0.0869565217391304, + 0.0666666666666667, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0625000000000000, + 0.0600000000000000, + 0.0612244897959184, + 0.0588235294117647, + 0.0588235294117647, + 0.0588235294117647, + 0.0576923076923077, + 0.0576923076923077, + 0.0576923076923077, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0727272727272727, + 0.0740740740740741, + 0.0740740740740741, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0862068965517241, + 0.0862068965517241, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0862068965517241, + 0.0877192982456140, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0714285714285714, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0666666666666667, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0517241379310345, + 0.0526315789473684, + 0.0526315789473684, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0892857142857143, + 0.0925925925925926, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0961538461538462, + 0.0784313725490196, + 0.0784313725490196, + 0.0754716981132075, + 0.0754716981132075, + 0.0740740740740741, + 0.0740740740740741, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0535714285714286, + 0.0545454545454545, + 0.0545454545454545, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0535714285714286, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0545454545454545, + 0.0545454545454545, + 0.0555555555555556, + 0.0555555555555556, + 0.0545454545454545, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0517241379310345, + 0.0517241379310345, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0508474576271187, + 0.0508474576271187, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0500000000000000, + 0.0508474576271187, + 0.0517241379310345, + 0.0517241379310345, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0526315789473684, + 0.0517241379310345, + 0.0526315789473684, + 0.0526315789473684, + 0.0689655172413793, + 0.0677966101694915, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0714285714285714, + 0.0701754385964912, + 0.0862068965517241, + 0.0862068965517241, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0847457627118644, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0526315789473684, + 0.0526315789473684, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0517241379310345, + 0.0677966101694915, + 0.0677966101694915, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0689655172413793, + 0.0701754385964912, + 0.0701754385964912, + 0.0701754385964912, + 0.0689655172413793, + 0.0689655172413793, + 0.0714285714285714, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0555555555555556, + 0.0377358490566038, + 0.0377358490566038, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0370370370370370, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0566037735849057, + 0.0566037735849057, + 0.0555555555555556, + 0.0740740740740741, + 0.0740740740740741, + 0.0740740740740741, + 0.0566037735849057, + 0.0566037735849057, + 0.0576923076923077, + 0.0576923076923077, + 0.0588235294117647, + 0.0600000000000000, + 0.0600000000000000, + 0.0612244897959184, + 0.0408163265306122, + 0.0408163265306122, + 0.0408163265306122, + 0.0408163265306122, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0400000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0400000000000000, + 0.0204081632653061, + 0.0208333333333333, + 0.0204081632653061, + 0.0200000000000000, + 0.0200000000000000, + 0.0200000000000000, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0392156862745098, + 0.0384615384615385, + 0.0377358490566038, + 0.0377358490566038, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0545454545454545, + 0.0535714285714286, + 0.0535714285714286, + 0.0535714285714286, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0566037735849057, + 0.0576923076923077, + 0.0566037735849057, + 0.0566037735849057, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0555555555555556, + 0.0566037735849057, + 0.0754716981132075, + 0.0754716981132075, + 0.0740740740740741, + 0.0740740740740741, + 0.0727272727272727, + 0.0714285714285714, + 0.0714285714285714, + 0.0714285714285714, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0862068965517241, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0877192982456140, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0892857142857143, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.1111111111111110, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0943396226415094, + 0.0961538461538462, + 0.0961538461538462, + 0.0980392156862745, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.1153846153846150, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0980392156862745, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0800000000000000, + 0.0816326530612245, + 0.0816326530612245, + 0.0816326530612245, + 0.0816326530612245, + 0.0816326530612245, + 0.0833333333333333, + 0.0816326530612245, + 0.0816326530612245, + 0.0816326530612245, + 0.0833333333333333, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.1000000000000000, + 0.1200000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1428571428571430, + 0.1372549019607840, + 0.1372549019607840, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1458333333333330, + 0.1458333333333330, + 0.1489361702127660, + 0.1458333333333330, + 0.1489361702127660, + 0.1304347826086960, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1521739130434780, + 0.1521739130434780, + 0.1702127659574470, + 0.1739130434782610, + 0.1818181818181820, + 0.1777777777777780, + 0.1818181818181820, + 0.1818181818181820, + 0.1904761904761900, + 0.1860465116279070, + 0.1818181818181820, + 0.1818181818181820, + 0.1860465116279070, + 0.2045454545454550, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2272727272727270, + 0.2325581395348840, + 0.2380952380952380, + 0.2380952380952380, + 0.2195121951219510, + 0.2195121951219510, + 0.2142857142857140, + 0.2142857142857140, + 0.2093023255813950, + 0.2093023255813950, + 0.2045454545454550, + 0.2045454545454550, + 0.1860465116279070, + 0.1860465116279070, + 0.1860465116279070, + 0.1860465116279070, + 0.1860465116279070, + 0.1904761904761900, + 0.2093023255813950, + 0.2093023255813950, + 0.2142857142857140, + 0.2142857142857140, + 0.2272727272727270, + 0.2142857142857140, + 0.2045454545454550, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2127659574468080, + 0.2173913043478260, + 0.2291666666666670, + 0.2291666666666670, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2549019607843140, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2549019607843140, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2692307692307690, + 0.2745098039215690, + 0.2745098039215690, + 0.2745098039215690, + 0.2745098039215690, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2653061224489800, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2600000000000000, + 0.2448979591836730, + 0.2448979591836730, + 0.2400000000000000, + 0.2244897959183670, + 0.2244897959183670, + 0.2244897959183670, + 0.2244897959183670, + 0.2291666666666670, + 0.2291666666666670, + 0.2244897959183670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2127659574468080, + 0.2127659574468080, + 0.2127659574468080, + 0.2083333333333330, + 0.2083333333333330, + 0.2083333333333330, + 0.2127659574468080, + 0.2127659574468080, + 0.2127659574468080, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2600000000000000, + 0.2745098039215690, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2641509433962260, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2830188679245280, + 0.2641509433962260, + 0.2641509433962260, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2692307692307690, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2549019607843140, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2352941176470590, + 0.2352941176470590, + 0.2200000000000000, + 0.2200000000000000, + 0.2200000000000000, + 0.2156862745098040, + 0.2156862745098040, + 0.2156862745098040, + 0.2156862745098040, + 0.2156862745098040, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2115384615384620, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2181818181818180, + 0.2321428571428570, + 0.2363636363636360, + 0.2363636363636360, + 0.2363636363636360, + 0.2363636363636360, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2545454545454540, + 0.2678571428571430, + 0.2678571428571430, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2545454545454540, + 0.2407407407407410, + 0.2407407407407410, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2264150943396230, + 0.2307692307692310, + 0.2156862745098040, + 0.2156862745098040, + 0.2000000000000000, + 0.2000000000000000, + 0.1960784313725490, + 0.1960784313725490, + 0.2264150943396230, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2075471698113210, + 0.1960784313725490, + 0.1960784313725490, + 0.1960784313725490, + 0.1960784313725490, + 0.1960784313725490, + 0.1960784313725490, + 0.2075471698113210, + 0.2075471698113210, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2037037037037040, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2075471698113210, + 0.2037037037037040, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.2000000000000000, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1754385964912280, + 0.1754385964912280, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1481481481481480, + 0.1481481481481480, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1132075471698110, + 0.1132075471698110, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1454545454545450, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1090909090909090, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1132075471698110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1111111111111110, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1272727272727270, + 0.1296296296296300, + 0.1296296296296300, + 0.1296296296296300, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1320754716981130, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1176470588235290, + 0.1176470588235290, + 0.1176470588235290, + 0.1176470588235290, + 0.1176470588235290, + 0.1176470588235290, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1346153846153850, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1372549019607840, + 0.1200000000000000, + 0.1200000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1224489795918370, + 0.1041666666666670, + 0.1041666666666670, + 0.1041666666666670, + 0.1041666666666670, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1200000000000000, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1200000000000000, + 0.1372549019607840, + 0.1428571428571430, + 0.1458333333333330, + 0.1458333333333330, + 0.1489361702127660, + 0.1521739130434780, + 0.1521739130434780, + 0.1521739130434780, + 0.1702127659574470, + 0.1875000000000000, + 0.2040816326530610, + 0.2083333333333330, + 0.2083333333333330, + 0.2083333333333330, + 0.2083333333333330, + 0.2083333333333330, + 0.2127659574468080, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2340425531914890, + 0.2340425531914890, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2553191489361700, + 0.2553191489361700, + 0.2608695652173910, + 0.2608695652173910, + 0.2444444444444440, + 0.2272727272727270, + 0.2093023255813950, + 0.2045454545454550, + 0.2045454545454550, + 0.2045454545454550, + 0.2045454545454550, + 0.2045454545454550, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2391304347826090, + 0.2391304347826090, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2222222222222220, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2553191489361700, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2553191489361700, + 0.2553191489361700, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2391304347826090, + 0.2553191489361700, + 0.2553191489361700, + 0.2553191489361700, + 0.2444444444444440, + 0.2391304347826090, + 0.2340425531914890, + 0.2340425531914890, + 0.2500000000000000, + 0.2500000000000000, + 0.2653061224489800, + 0.2708333333333330, + 0.2765957446808510, + 0.2708333333333330, + 0.2857142857142860, + 0.2857142857142860, + 0.2553191489361700, + 0.2553191489361700, + 0.2608695652173910, + 0.2608695652173910, + 0.2608695652173910, + 0.2608695652173910, + 0.3061224489795920, + 0.2978723404255320, + 0.2978723404255320, + 0.2978723404255320, + 0.2978723404255320, + 0.3125000000000000, + 0.3125000000000000, + 0.3125000000000000, + 0.3125000000000000, + 0.3191489361702130, + 0.3191489361702130, + 0.3191489361702130, + 0.3191489361702130, + 0.2888888888888890, + 0.2826086956521740, + 0.2888888888888890, + 0.2727272727272730, + 0.2727272727272730, + 0.2790697674418600, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3191489361702130, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3191489361702130, + 0.3333333333333330, + 0.3333333333333330, + 0.3265306122448980, + 0.3333333333333330, + 0.3469387755102040, + 0.3600000000000000, + 0.3600000000000000, + 0.3469387755102040, + 0.3333333333333330, + 0.3333333333333330, + 0.3265306122448980, + 0.3061224489795920, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3137254901960780, + 0.3137254901960780, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.2916666666666670, + 0.2978723404255320, + 0.2978723404255320, + 0.3125000000000000, + 0.3125000000000000, + 0.3125000000000000, + 0.2978723404255320, + 0.2916666666666670, + 0.2916666666666670, + 0.3061224489795920, + 0.3061224489795920, + 0.2916666666666670, + 0.3061224489795920, + 0.3000000000000000, + 0.3000000000000000, + 0.3137254901960780, + 0.3269230769230770, + 0.3333333333333330, + 0.3269230769230770, + 0.3269230769230770, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3207547169811320, + 0.3269230769230770, + 0.3269230769230770, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3454545454545450, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3396226415094340, + 0.3396226415094340, + 0.3396226415094340, + 0.3396226415094340, + 0.3396226415094340, + 0.3461538461538460, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3518518518518520, + 0.3518518518518520, + 0.3518518518518520, + 0.3396226415094340, + 0.3269230769230770, + 0.3137254901960780, + 0.3137254901960780, + 0.3137254901960780, + 0.3269230769230770, + 0.3269230769230770, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3200000000000000, + 0.3061224489795920, + 0.3200000000000000, + 0.3137254901960780, + 0.3137254901960780, + 0.3137254901960780, + 0.3269230769230770, + 0.3269230769230770, + 0.3269230769230770, + 0.3269230769230770, + 0.3333333333333330, + 0.3333333333333330, + 0.3400000000000000, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3400000000000000, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3469387755102040, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3673469387755100, + 0.3800000000000000, + 0.3800000000000000, + 0.3800000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.3958333333333330, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4130434782608700, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4166666666666670, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4375000000000000, + 0.4468085106382980, + 0.4468085106382980, + 0.4468085106382980, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4565217391304350, + 0.4565217391304350, + 0.4565217391304350, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4444444444444440, + 0.4347826086956520, + 0.4347826086956520, + 0.4347826086956520, + 0.4255319148936170, + 0.4255319148936170, + 0.4255319148936170, + 0.4255319148936170, + 0.4255319148936170, + 0.4130434782608700, + 0.4130434782608700, + 0.4255319148936170, + 0.4255319148936170, + 0.4255319148936170, + 0.4255319148936170, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.4166666666666670, + 0.4166666666666670, + 0.4285714285714290, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4166666666666670, + 0.4200000000000000, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4081632653061220, + 0.4000000000000000, + 0.4117647058823530, + 0.4038461538461540, + 0.4150943396226420, + 0.4074074074074070, + 0.4074074074074070, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4038461538461540, + 0.3962264150943400, + 0.4038461538461540, + 0.4038461538461540, + 0.4038461538461540, + 0.4038461538461540, + 0.4038461538461540, + 0.3877551020408160, + 0.3921568627450980, + 0.3921568627450980, + 0.3800000000000000, + 0.3800000000000000, + 0.3800000000000000, + 0.3800000000000000, + 0.3725490196078430, + 0.3725490196078430, + 0.3725490196078430, + 0.3725490196078430, + 0.3846153846153850, + 0.3962264150943400, + 0.4038461538461540, + 0.4038461538461540, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4181818181818180, + 0.4181818181818180, + 0.4181818181818180, + 0.4181818181818180, + 0.4181818181818180, + 0.4074074074074070, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.4074074074074070, + 0.4074074074074070, + 0.4074074074074070, + 0.4000000000000000, + 0.4107142857142860, + 0.4107142857142860, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3928571428571430, + 0.3818181818181820, + 0.3818181818181820, + 0.3818181818181820, + 0.3818181818181820, + 0.3818181818181820, + 0.3703703703703700, + 0.3818181818181820, + 0.3818181818181820, + 0.3818181818181820, + 0.3888888888888890, + 0.3962264150943400, + 0.4074074074074070, + 0.4074074074074070, + 0.4000000000000000, + 0.4000000000000000, + 0.3888888888888890, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.4074074074074070, + 0.4000000000000000, + 0.3962264150943400, + 0.3846153846153850, + 0.3846153846153850, + 0.3725490196078430, + 0.3725490196078430, + 0.3653846153846150, + 0.3653846153846150, + 0.3773584905660380, + 0.3773584905660380, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3584905660377360, + 0.3773584905660380, + 0.3773584905660380, + 0.3653846153846150, + 0.3653846153846150, + 0.3653846153846150, + 0.3653846153846150, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3518518518518520, + 0.3518518518518520, + 0.3518518518518520, + 0.3518518518518520, + 0.3584905660377360, + 0.3584905660377360, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3518518518518520, + 0.3454545454545450, + 0.3454545454545450, + 0.3571428571428570, + 0.3571428571428570, + 0.3571428571428570, + 0.3571428571428570, + 0.3508771929824560, + 0.3508771929824560, + 0.3508771929824560, + 0.3508771929824560, + 0.3392857142857140, + 0.3333333333333330, + 0.3396226415094340, + 0.3461538461538460, + 0.3461538461538460, + 0.3461538461538460, + 0.3529411764705880, + 0.3653846153846150, + 0.3653846153846150, + 0.3653846153846150, + 0.3653846153846150, + 0.3653846153846150, + 0.3529411764705880, + 0.3529411764705880, + 0.3265306122448980, + 0.3265306122448980, + 0.3265306122448980, + 0.3265306122448980, + 0.3265306122448980, + 0.3333333333333330, + 0.3265306122448980, + 0.3265306122448980, + 0.3265306122448980, + 0.3333333333333330, + 0.3333333333333330, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3541666666666670, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3800000000000000, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3600000000000000, + 0.3600000000000000, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3653846153846150, + 0.3653846153846150, + 0.3800000000000000, + 0.3800000000000000, + 0.3800000000000000, + 0.3800000000000000, + 0.3800000000000000, + 0.3673469387755100, + 0.3469387755102040, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3469387755102040, + 0.3400000000000000, + 0.3400000000000000, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3529411764705880, + 0.3600000000000000, + 0.3600000000000000, + 0.3469387755102040, + 0.3469387755102040, + 0.3333333333333330, + 0.3333333333333330, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3469387755102040, + 0.3600000000000000, + 0.3725490196078430, + 0.3846153846153850, + 0.3846153846153850, + 0.3846153846153850, + 0.3846153846153850, + 0.3962264150943400, + 0.3962264150943400, + 0.4038461538461540, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.3962264150943400, + 0.4038461538461540, + 0.4259259259259260, + 0.4259259259259260, + 0.4259259259259260, + 0.4259259259259260, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4150943396226420, + 0.4000000000000000, + 0.3818181818181820, + 0.3818181818181820, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.3962264150943400, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.3888888888888890, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3888888888888890, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3703703703703700, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3584905660377360, + 0.3773584905660380, + 0.3773584905660380, + 0.3962264150943400, + 0.3962264150943400, + 0.3888888888888890, + 0.3818181818181820, + 0.3928571428571430, + 0.4035087719298250, + 0.4035087719298250, + 0.4035087719298250, + 0.4137931034482760, + 0.4137931034482760, + 0.4000000000000000, + 0.4000000000000000, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4210526315789470, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4210526315789470, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4107142857142860, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3888888888888890, + 0.3818181818181820, + 0.3818181818181820, + 0.3584905660377360, + 0.3584905660377360, + 0.3461538461538460, + 0.3461538461538460, + 0.3137254901960780, + 0.3000000000000000, + 0.3137254901960780, + 0.3137254901960780, + 0.3137254901960780, + 0.3137254901960780, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.3000000000000000, + 0.2800000000000000, + 0.2653061224489800, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.3076923076923080, + 0.2941176470588230, + 0.2941176470588230, + 0.2941176470588230, + 0.2941176470588230, + 0.2941176470588230, + 0.2941176470588230, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3207547169811320, + 0.3090909090909090, + 0.3090909090909090, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2962962962962960, + 0.2909090909090910, + 0.2777777777777780, + 0.2641509433962260, + 0.2777777777777780, + 0.2777777777777780, + 0.2727272727272730, + 0.2857142857142860, + 0.2807017543859650, + 0.2758620689655170, + 0.2758620689655170, + 0.2758620689655170, + 0.2758620689655170, + 0.2758620689655170, + 0.2631578947368420, + 0.2631578947368420, + 0.2631578947368420, + 0.2586206896551720, + 0.2456140350877190, + 0.2456140350877190, + 0.2456140350877190, + 0.2456140350877190, + 0.2321428571428570, + 0.2321428571428570, + 0.2321428571428570, + 0.2321428571428570, + 0.2280701754385960, + 0.2280701754385960, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2241379310344830, + 0.2280701754385960, + 0.2280701754385960, + 0.2280701754385960, + 0.2280701754385960, + 0.2280701754385960, + 0.2280701754385960, + 0.2280701754385960, + 0.2280701754385960, + 0.2142857142857140, + 0.2142857142857140, + 0.2068965517241380, + 0.2068965517241380, + 0.2068965517241380, + 0.2068965517241380, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1929824561403510, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1964285714285710, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1818181818181820, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1785714285714290, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1896551724137930, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1754385964912280, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1724137931034480, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1578947368421050, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1607142857142860, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1636363636363640, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1698113207547170, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1730769230769230, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1764705882352940, + 0.1600000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1600000000000000, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1568627450980390, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1063829787234040, + 0.1063829787234040, + 0.1063829787234040, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1400000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1333333333333330, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1777777777777780, + 0.1956521739130430, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2244897959183670, + 0.2244897959183670, + 0.2244897959183670, + 0.2244897959183670, + 0.2244897959183670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2653061224489800, + 0.2653061224489800, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2765957446808510, + 0.2916666666666670, + 0.2978723404255320, + 0.3125000000000000, + 0.3265306122448980, + 0.3265306122448980, + 0.3333333333333330, + 0.3191489361702130, + 0.3191489361702130, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3333333333333330, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3333333333333330, + 0.3260869565217390, + 0.3043478260869570, + 0.3043478260869570, + 0.2954545454545450, + 0.2954545454545450, + 0.2954545454545450, + 0.2790697674418600, + 0.2666666666666670, + 0.2666666666666670, + 0.2826086956521740, + 0.2826086956521740, + 0.2888888888888890, + 0.2888888888888890, + 0.2727272727272730, + 0.2558139534883720, + 0.2558139534883720, + 0.2558139534883720, + 0.2500000000000000, + 0.2666666666666670, + 0.2608695652173910, + 0.2608695652173910, + 0.2553191489361700, + 0.2553191489361700, + 0.2708333333333330, + 0.2500000000000000, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2448979591836730, + 0.2448979591836730, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2448979591836730, + 0.2448979591836730, + 0.2400000000000000, + 0.2400000000000000, + 0.2549019607843140, + 0.2549019607843140, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2400000000000000, + 0.2448979591836730, + 0.2448979591836730, + 0.2448979591836730, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2800000000000000, + 0.2653061224489800, + 0.2653061224489800, + 0.2800000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2448979591836730, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2553191489361700, + 0.2608695652173910, + 0.2608695652173910, + 0.2608695652173910, + 0.2608695652173910, + 0.2608695652173910, + 0.2553191489361700, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2708333333333330, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2653061224489800, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2800000000000000, + 0.2857142857142860, + 0.2916666666666670, + 0.2916666666666670, + 0.2916666666666670, + 0.2916666666666670, + 0.2916666666666670, + 0.2857142857142860, + 0.2916666666666670, + 0.2916666666666670, + 0.3061224489795920, + 0.3061224489795920, + 0.2978723404255320, + 0.2978723404255320, + 0.2826086956521740, + 0.2826086956521740, + 0.2727272727272730, + 0.2727272727272730, + 0.2888888888888890, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3191489361702130, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3111111111111110, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3181818181818180, + 0.3023255813953490, + 0.3023255813953490, + 0.2790697674418600, + 0.2857142857142860, + 0.3023255813953490, + 0.3023255813953490, + 0.3023255813953490, + 0.3181818181818180, + 0.3333333333333330, + 0.3617021276595740, + 0.3877551020408160, + 0.3877551020408160, + 0.4000000000000000, + 0.4000000000000000, + 0.4117647058823530, + 0.4117647058823530, + 0.4117647058823530, + 0.4117647058823530, + 0.4000000000000000, + 0.3877551020408160, + 0.3750000000000000, + 0.3750000000000000, + 0.3750000000000000, + 0.3750000000000000, + 0.3877551020408160, + 0.3877551020408160, + 0.3800000000000000, + 0.3800000000000000, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3673469387755100, + 0.3541666666666670, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3478260869565220, + 0.3478260869565220, + 0.3478260869565220, + 0.3404255319148940, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3260869565217390, + 0.3191489361702130, + 0.3191489361702130, + 0.3043478260869570, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2727272727272730, + 0.2888888888888890, + 0.2888888888888890, + 0.2826086956521740, + 0.2888888888888890, + 0.2888888888888890, + 0.3043478260869570, + 0.3191489361702130, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3409090909090910, + 0.3409090909090910, + 0.3409090909090910, + 0.3409090909090910, + 0.3409090909090910, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3333333333333330, + 0.3333333333333330, + 0.3333333333333330, + 0.3478260869565220, + 0.3478260869565220, + 0.3478260869565220, + 0.3555555555555560, + 0.3478260869565220, + 0.3478260869565220, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3478260869565220, + 0.3617021276595740, + 0.3617021276595740, + 0.3478260869565220, + 0.3478260869565220, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3404255319148940, + 0.3541666666666670, + 0.3541666666666670, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3617021276595740, + 0.3541666666666670, + 0.3600000000000000, + 0.3600000000000000, + 0.3600000000000000, + 0.3725490196078430, + 0.3725490196078430, + 0.3725490196078430, + 0.3800000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3877551020408160, + 0.3877551020408160, + 0.3877551020408160, + 0.3877551020408160, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.4000000000000000, + 0.3877551020408160, + 0.3877551020408160, + 0.3750000000000000, + 0.3750000000000000, + 0.3695652173913040, + 0.3695652173913040, + 0.3695652173913040, + 0.3695652173913040, + 0.3555555555555560, + 0.3555555555555560, + 0.3695652173913040, + 0.3695652173913040, + 0.3695652173913040, + 0.3695652173913040, + 0.3617021276595740, + 0.3695652173913040, + 0.3555555555555560, + 0.3409090909090910, + 0.3555555555555560, + 0.3555555555555560, + 0.3777777777777780, + 0.3863636363636360, + 0.3953488372093020, + 0.3953488372093020, + 0.3953488372093020, + 0.3953488372093020, + 0.3863636363636360, + 0.3863636363636360, + 0.3863636363636360, + 0.3863636363636360, + 0.3863636363636360, + 0.3863636363636360, + 0.3863636363636360, + 0.3863636363636360, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3636363636363640, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3777777777777780, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3409090909090910, + 0.3409090909090910, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3414634146341460, + 0.3170731707317070, + 0.3095238095238100, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3095238095238100, + 0.3095238095238100, + 0.3255813953488370, + 0.3255813953488370, + 0.3095238095238100, + 0.3095238095238100, + 0.3095238095238100, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3255813953488370, + 0.3095238095238100, + 0.3095238095238100, + 0.3255813953488370, + 0.3255813953488370, + 0.3409090909090910, + 0.3409090909090910, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3555555555555560, + 0.3409090909090910, + 0.3409090909090910, + 0.3488372093023260, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3829787234042550, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.3913043478260870, + 0.4042553191489360, + 0.4042553191489360, + 0.4042553191489360, + 0.3913043478260870, + 0.4000000000000000, + 0.4000000000000000, + 0.3863636363636360, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3636363636363640, + 0.3488372093023260, + 0.3488372093023260, + 0.3488372093023260, + 0.3409090909090910, + 0.3255813953488370, + 0.3255813953488370, + 0.3181818181818180, + 0.3181818181818180, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3260869565217390, + 0.3404255319148940, + 0.3404255319148940, + 0.3260869565217390, + 0.3023255813953490, + 0.3181818181818180, + 0.3111111111111110, + 0.3111111111111110, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3043478260869570, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3260869565217390, + 0.3260869565217390, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3111111111111110, + 0.3260869565217390, + 0.3111111111111110, + 0.3111111111111110, + 0.2954545454545450, + 0.2954545454545450, + 0.2954545454545450, + 0.2954545454545450, + 0.3260869565217390, + 0.3191489361702130, + 0.3191489361702130, + 0.3191489361702130, + 0.3191489361702130, + 0.3191489361702130, + 0.3125000000000000, + 0.3125000000000000, + 0.3125000000000000, + 0.3125000000000000, + 0.2978723404255320, + 0.2826086956521740, + 0.2826086956521740, + 0.2765957446808510, + 0.2978723404255320, + 0.2978723404255320, + 0.2916666666666670, + 0.2765957446808510, + 0.2765957446808510, + 0.2765957446808510, + 0.2765957446808510, + 0.2916666666666670, + 0.2916666666666670, + 0.3061224489795920, + 0.3061224489795920, + 0.3061224489795920, + 0.3061224489795920, + 0.2916666666666670, + 0.2916666666666670, + 0.2916666666666670, + 0.2916666666666670, + 0.2708333333333330, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2500000000000000, + 0.2340425531914890, + 0.2340425531914890, + 0.2173913043478260, + 0.2173913043478260, + 0.1956521739130430, + 0.1956521739130430, + 0.1956521739130430, + 0.1956521739130430, + 0.2173913043478260, + 0.2173913043478260, + 0.2000000000000000, + 0.2000000000000000, + 0.2173913043478260, + 0.2173913043478260, + 0.1956521739130430, + 0.1956521739130430, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2291666666666670, + 0.2244897959183670, + 0.2083333333333330, + 0.1914893617021280, + 0.1914893617021280, + 0.1875000000000000, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1914893617021280, + 0.1739130434782610, + 0.1702127659574470, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1836734693877550, + 0.1875000000000000, + 0.1914893617021280, + 0.1914893617021280, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1739130434782610, + 0.1777777777777780, + 0.1702127659574470, + 0.1702127659574470, + 0.1702127659574470, + 0.1702127659574470, + 0.1702127659574470, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1875000000000000, + 0.1836734693877550, + 0.1836734693877550, + 0.1666666666666670, + 0.1666666666666670, + 0.1666666666666670, + 0.1458333333333330, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1428571428571430, + 0.1458333333333330, + 0.1458333333333330, + 0.1458333333333330, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1276595744680850, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1250000000000000, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1224489795918370, + 0.1041666666666670, + 0.1041666666666670, + 0.1041666666666670, + 0.1041666666666670, + 0.1041666666666670, + 0.1020408163265310, + 0.1020408163265310, + 0.1020408163265310, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1020408163265310, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0980392156862745, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0800000000000000, + 0.0816326530612245, + 0.1000000000000000, + 0.1000000000000000, + 0.0980392156862745, + 0.0980392156862745, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0961538461538462, + 0.0943396226415094, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0909090909090909, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0925925925925926, + 0.0909090909090909, + 0.0740740740740741, + 0.0727272727272727, + 0.0727272727272727, + 0.0727272727272727, + 0.0714285714285714, + 0.0545454545454545, + 0.0545454545454545, + 0.0535714285714286, + 0.0535714285714286, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0363636363636364, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0357142857142857, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0350877192982456, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0344827586206897, + 0.0175438596491228, + 0.0175438596491228, + 0.0175438596491228 + } + } + }; + +} /* namespace prob_features */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_FEATURES_MODEL_H_ */ diff --git a/src/my-place/user_places/similarity.h b/src/my-place/user_places/similarity.h new file mode 100644 index 0000000..5938ef5 --- /dev/null +++ b/src/my-place/user_places/similarity.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_SIMILAR_H_ +#define _CONTEXT_PLACE_RECOGNITION_SIMILAR_H_ + +#include "user_places_types.h" + +namespace ctx { + +namespace similarity { + + template ctx::share_t overlap1stOver2nd(const T &s1, const T &s2) + { + if (s2.empty()) { + return 0; + } + int count = 0; + for (auto e : s2) { + if (s1.find(e) != s1.end()) { + count++; + } + } + return (ctx::share_t) count / s2.size(); + } + + template ctx::share_t overlapBiggerOverSmaller(const T &s1, const T &s2) + { + if (s1.size() > s2.size()) { + return similarity::overlap1stOver2nd(s1, s2); + } else { + return similarity::overlap1stOver2nd(s2, s1); + } + } + + template bool isJoint(const T &s1, const T &s2) + { + for (auto e : s2) { + if (s1.find(e) != s1.end()) { + return true; + } + } + return false; + } + +} /* namespace similarity */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_SIMILAR_H_ */ diff --git a/src/my-place/user_places/user_places.cpp b/src/my-place/user_places/user_places.cpp new file mode 100644 index 0000000..ca237ea --- /dev/null +++ b/src/my-place/user_places/user_places.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "user_places.h" +#include "places_detector.h" +#include "../place_recognition_types.h" + +ctx::UserPlaces::UserPlaces(PlaceRecogMode energyMode): + __visitDetector(nullptr), + __placesDetector(nullptr), + __placesDetectorTimerId(-1) +{ + time_t now = std::time(nullptr); + __visitDetector = new(std::nothrow) VisitDetector(now, energyMode); + if (__visitDetector == nullptr) { + _E("Cannot initialize __visitDetector"); + return; + } + + __placesDetector = new(std::nothrow) PlacesDetector(); + if (__placesDetector == nullptr) { + _E("Cannot initialize __placesDetector"); + return; + } + + __placesDetectorTimerId = __timerManager.setAt( // execute once every night + PLACES_DETECTOR_TASK_START_HOUR, + PLACES_DETECTOR_TASK_START_MINUTE, + DayOfWeek::EVERYDAY, + __placesDetector); + if (__placesDetectorTimerId < 0) { + _E("PlacesDetector timer set FAIL"); + return; + } else { + _D("PlacesDetector timer set SUCCESS"); + } +} + +ctx::UserPlaces::~UserPlaces() +{ + if (__placesDetectorTimerId >= 0) { + __timerManager.remove(__placesDetectorTimerId); + _D("PlacesDetector timer removed"); + } + + if (__visitDetector) { + delete __visitDetector; + } + + if (__placesDetector) { + delete __placesDetector; + } +}; + +std::vector> ctx::UserPlaces::getPlaces() +{ + if (__placesDetector) { + return __placesDetector->getPlaces(); + } else { + return std::vector>(); + } +} + +/* + * Example JSON output: + * ------------------------------------------------ + * { + * "PlacesList": [ + * { + * "TypeId": 2, + * "Name": "Work", + * "GeoLatitude": 10.94433, + * "GeoLongitude": 50.85504, + * "WifiAPs": "00:1f:f3:5b:2b:1f,15:34:56:78:9a:ba,13:34:56:78:9a:ba", + * "CreateDate": 12132567 + * }, + * { + * "TypeId": 1, + * "Name": "Home", + * "GeoLatitude": 10.96233, + * "GeoLongitude": 50.84304, + * "WifiAPs": "aa:bb:cc:dd:ee:ff,10:34:56:78:9a:bc", + * "CreateDate": 12132889 + * }, + * { + * "TypeId": 3, + * "Name": "Other", + * "GeoLatitude": 10.96553, + * "GeoLongitude": 50.80404, + * "WifiAPs": "12:34:56:78:9a:ba", + * "CreateDate": 12132346 + * } + * ] + * } + */ +ctx::Json ctx::UserPlaces::composeJson(std::vector> places) +{ + ctx::Json data; + for (std::shared_ptr place : places) { + ctx::Json placeJson; + placeJson.set(NULL, PLACE_CATEG_ID, place->categId); + placeJson.set(NULL, PLACE_CATEG_CONFIDENCE, place->categConfidence); + placeJson.set(NULL, PLACE_NAME, place->name); + if (place->locationValid) { + placeJson.set(NULL, PLACE_GEO_LATITUDE, place->location.latitude); + placeJson.set(NULL, PLACE_GEO_LONGITUDE, place->location.longitude); + } + placeJson.set(NULL, PLACE_WIFI_APS, place->wifiAps); + placeJson.set(NULL, PLACE_CREATE_DATE, static_cast(place->createDate)); + data.append(NULL, DATA_READ, placeJson); + } + return data; +} + +void ctx::UserPlaces::setMode(PlaceRecogMode energyMode) +{ + if (__visitDetector) { + __visitDetector->setMode(energyMode); + } +} diff --git a/src/my-place/user_places/user_places.h b/src/my-place/user_places/user_places.h new file mode 100644 index 0000000..1df6388 --- /dev/null +++ b/src/my-place/user_places/user_places.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_USER_PLACES_H_ +#define _CONTEXT_PLACE_RECOGNITION_USER_PLACES_H_ + +#include +#include +#include +#include "visit_detector.h" +#include "places_detector.h" +#include "user_places_types.h" + +namespace ctx { + + class UserPlaces { + + private: + VisitDetector *__visitDetector; + PlacesDetector *__placesDetector; + int __placesDetectorTimerId; + TimerManager __timerManager; + + public: + UserPlaces(PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE); + ~UserPlaces(); + + void setMode(PlaceRecogMode energyMode); + std::vector> getPlaces(); + static Json composeJson(std::vector> places); + + }; /* class UserPlaces */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_USER_PLACES_H_ */ diff --git a/src/my-place/user_places/user_places_params.h b/src/my-place/user_places/user_places_params.h new file mode 100644 index 0000000..ec70a29 --- /dev/null +++ b/src/my-place/user_places/user_places_params.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_USER_PLACES_PARAMS_H_ +#define _CONTEXT_PLACE_RECOGNITION_USER_PLACES_PARAMS_H_ + +/* + * WiFi scanning frequency (in minutes) in PLACE_RECOG_HIGH_ACCURACY_MODE. + */ +#define WIFI_LOGGER_INTERVAL_MINUTES_HIGH_ACCURACY 3 + +/* + * WiFi scanning frequency (in minutes) in PLACE_RECOG_LOW_POWER_MODE. + */ +#define WIFI_LOGGER_INTERVAL_MINUTES_LOW_POWER 60 + +/* + * Time window taken into consideration (in seconds) in PLACE_RECOG_HIGH_ACCURACY_MODE. + */ +#define VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY 360 + +/* + * Time window taken into consideration (in seconds) in PLACE_RECOG_LOW_POWER_MODE. + */ +#define VISIT_DETECTOR_PERIOD_SECONDS_LOW_POWER 3600 + +/* + * Overlap threshold between two sets of mac addresses (overlap + * coefficient for two sets should be higher than this threshold + * in order to detect stable radio environment); =< 1.0 + * New parameter in algorithm compared to original version of PlaceSense! + */ +#define VISIT_DETECTOR_OVERLAP 0.8f + +/* + * Specifies how many stable intervals must be seen to + * indicate an entrance to a place; >= 1 + */ +#define VISIT_DETECTOR_STABLE_DEPTH 1 + +/* + * Representatives threshold (representatnive beacon + * response rate should be higher than this threshold); =< 1.0 + */ +#define VISIT_DETECTOR_REP_THRESHOLD 0.9f + +/* + * Specifies how long scans must be unstable to indicate a leave form a place; >= 1 + */ +#define VISIT_DETECTOR_TOLERANCE_DEPTH 3 + +#define PLACES_DETECTOR_TASK_START_HOUR 3 +#define PLACES_DETECTOR_TASK_START_MINUTE 11 +#define PLACES_DETECTOR_RETENTION_DAYS 30 +#define PLACES_DETECTOR_RETENTION_SECONDS 24 * 60 * 60 * PLACES_DETECTOR_RETENTION_DAYS + +/* + * Number of digits after decimal point used in geo coordinates. + */ +#define GEO_LOCATION_PRECISION 7 + +/* + * Minimal duration of visit (in minutes) taking into account for place detection + */ +#define PLACES_DETECTOR_MIN_VISIT_DURATION_MINUTES 15 + +/* + * Maximum duration of visit (in minutes) taking into account for place detection + */ +#define PLACES_DETECTOR_MAX_VISIT_DURATION_MINUTES 5 * 24 * 60 + +/* + * Minimum visits number per place + */ +#define PLACES_DETECTOR_MIN_VISITS_PER_PLACE 1 + +/* + * Minimum visits number per big place + */ +#define PLACES_DETECTOR_MIN_VISITS_PER_BIG_PLACE 4 + +/* + * Minimal visit category score for taking this visit into consideration during + * place categorization + */ +#define PLACES_CATEGER_MIN_VISITS_SCORE 0.1 + +/* + * Minimum visits number per home + */ +#define PLACES_CATEGER_MIN_VISITS_PER_HOME 3 + +/* + * Minimum visits number per work + */ +#define PLACES_CATEGER_MIN_VISITS_PER_WORK 2 + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_USER_PLACES_PARAMS_H_ */ diff --git a/src/my-place/user_places/user_places_types.cpp b/src/my-place/user_places/user_places_types.cpp new file mode 100644 index 0000000..14b1355 --- /dev/null +++ b/src/my-place/user_places/user_places_types.cpp @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include +#include +#include +#include "user_places_types.h" +#include "user_places_params.h" +#include "debug_utils.h" + +#define __MAC_STRING_COMPONENTS_SEPARATOR ':' +#define __MAC_SET_STRING_DELIMITER ',' + +ctx::Mac::Mac(const std::string& str) +{ + std::stringstream ss(str); + try { + ss >> *this; + } catch (std::runtime_error &e) { + _E("%s", e.what()); + } +} + +ctx::Mac::Mac(const char *str) +{ + std::stringstream ss(str); + try { + ss >> *this; + } catch (std::runtime_error &e) { + _E("%s", e.what()); + } +} + +std::istream& ctx::operator>>(std::istream &input, ctx::Mac &mac) +{ + int h; + char colon; + for (size_t i = 0; i < ctx::Mac::MAC_SIZE; i++) { + input >> std::hex; + input >> h; + mac.c[i] = h; + if (i + 1 >= ctx::Mac::MAC_SIZE) { + break; + } + input >> colon; + if (colon != __MAC_STRING_COMPONENTS_SEPARATOR) { + throw std::runtime_error("Invalid MAC format"); + } + } + input >> std::dec; + return input; +} + +std::ostream& ctx::operator<<(std::ostream &output, const ctx::Mac &mac) +{ + size_t i = 0; + while (true) { + output << std::hex << std::setfill('0') << std::setw(2); + output << static_cast(mac.c[i]); + i++; + if (i >= Mac::MAC_SIZE) { + break; + } + output << __MAC_STRING_COMPONENTS_SEPARATOR; + } + output << std::dec; + return output; +} + +ctx::Mac::operator std::string() const +{ + std::stringstream ss; + ss << *this; + return ss.str(); +} + +bool ctx::operator==(const Mac &m1, const Mac &m2) +{ + for (size_t i = 0; i < Mac::MAC_SIZE; i++) { + if (m1.c[i] != m2.c[i]) { + return false; + } + } + return true; +} + +bool ctx::operator!=(const Mac &m1, const Mac &m2) +{ + return !(m1 == m2); +} + +bool ctx::operator<(const Mac &m1, const Mac &m2) +{ + unsigned char c1, c2; + for (size_t i = 0; i < Mac::MAC_SIZE; i++) { + c1 = m1.c[i]; + c2 = m2.c[i]; + if (c1 < c2) { + return true; + } + if (c1 > c2) { + return false; + } + } + return false; // they are equal +} + +std::istream& ctx::operator>>(std::istream &input, ctx::MacSet &macSet) +{ + Mac mac; + char delimeter; + while (!input.eof()) { + try { + input >> mac; + } catch (std::runtime_error &e) { + _E("Cannot read macSet. Exception: %s", e.what()); + break; + } + macSet.insert(mac); + if (input.eof()) { + break; + } + delimeter = input.get(); + if (delimeter != __MAC_SET_STRING_DELIMITER) { + input.unget(); + break; + } + } + return input; +} + +std::ostream& ctx::operator<<(std::ostream &output, const ctx::MacSet &macSet) +{ + std::vector macVec(macSet.size()); + std::copy(macSet.begin(), macSet.end(), macVec.begin()); + std::sort(macVec.begin(), macVec.end()); + + bool first = true; + for (auto &mac: macVec) { + if (first) { + first = false; + } else { + output << __MAC_SET_STRING_DELIMITER; + } + output << mac; + } + return output; +} + +void ctx::LocationEvent::log() +{ + std::string time_str = DebugUtils::humanReadableDateTime(timestamp, "%T", 9); +#ifdef TIZEN_ENGINEER_MODE + _D("location lat=%.8f, lon=%.8f, acc=%.2f[m], time=%s, method=%d", + coordinates.latitude, + coordinates.longitude, + coordinates.accuracy, + time_str.c_str(), + method); +#else /* TIZEN_ENGINEER_MODE */ + _D("location lat=%.8f, lon=%.8f, acc=%.2f[m], time=%s", + coordinates.latitude, + coordinates.longitude, + coordinates.accuracy, + time_str.c_str()); +#endif /* TIZEN_ENGINEER_MODE */ +} + +void ctx::Visit::setLocation(Location location_) +{ + locationValid = true; + location = location_; +} + +void ctx::Visit::printShort2Stream(std::ostream &out) const +{ + // print only valid visits + if (interval.end != 0) { + float duration = ((float) (interval.end - interval.start)) / 3600; // [h] + out << "__VISIT " << duration << "h: "; + out << DebugUtils::humanReadableDateTime(interval.start, "%m/%d %H:%M", 15) << " ÷ "; + out << DebugUtils::humanReadableDateTime(interval.end, "%m/%d %H:%M", 15) << std::endl; + } +} + +bool ctx::operator==(const ctx::Visit &v1, const ctx::Visit &v2) +{ + return v1.interval.start == v2.interval.start + && v1.interval.end == v2.interval.end + && v1.categs == v2.categs + && v1.location.latitude == v2.location.latitude + && v1.location.longitude == v2.location.longitude + && v1.location.accuracy == v2.location.accuracy + && v1.locationValid == v2.locationValid + && v1.macSet == v2.macSet; +} + +ctx::MacSet ctx::macSetFromString(const std::string &str) +{ + MacSet macSet; + std::stringstream ss; + ss << str; + ss >> macSet; + return macSet; +} + +bool ctx::operator>(const Mac &m1, const Mac &m2) +{ + return m2 < m1; +} + +std::shared_ptr ctx::macSetFromMacs2Counts(const Macs2Counts &macs2Counts) +{ + std::shared_ptr macSet(std::make_shared()); + for (auto &macCount: macs2Counts) { + macSet->insert(macCount.first); + } + return macSet; +} + +std::shared_ptr ctx::macSetsUnion(const std::vector> &macSets) +{ + std::shared_ptr unionSet = std::make_shared(); + for (std::shared_ptr macSet : macSets) { + unionSet->insert(macSet->begin(), macSet->end()); + } + return unionSet; +} + +ctx::Interval::Interval(time_t start_, time_t end_) : start(start_), end(end_) { + if (end_ < start_) { + _E("Negative interval, start=%d, end=%d", start_, end_); + } +} + +void ctx::Place::print2Stream(std::ostream &out) const +{ + out << "PLACE:" << std::endl; + out << "__CATEGORY: " << name << std::endl; + if (locationValid) { + out << "__LOCATION: lat=" << std::setprecision(GEO_LOCATION_PRECISION + 2) << location.latitude; + out << ", lon=" << location.longitude << std::setprecision(5) << std::endl; + } + out << "__WIFI:" << wifiAps << std::endl; + out << "__CREATE_DATE: " << DebugUtils::humanReadableDateTime(createDate, "%F %T", 80) << std::endl; +} diff --git a/src/my-place/user_places/user_places_types.h b/src/my-place/user_places/user_places_types.h new file mode 100644 index 0000000..cdf7be4 --- /dev/null +++ b/src/my-place/user_places/user_places_types.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_USER_PLACES_TYPES_H_ +#define _CONTEXT_PLACE_RECOGNITION_USER_PLACES_TYPES_H_ + +#include +#include +#include +#include +#include +#include "graph.h" +#include "../place_recognition_types.h" +#include +#include + +namespace ctx { + + /* + * type for numerical computations + */ + typedef double num_t; + + /* + * mac address + */ + class Mac { + + public: + const static size_t MAC_SIZE = 6; // number of bytes for mac address. + unsigned char c[MAC_SIZE]; + + Mac() {}; + Mac(const std::string &str); + Mac(const char *str); + operator std::string() const; + + }; /* class Mac */ + + std::istream &operator>>(std::istream &input, ctx::Mac &mac); + std::ostream &operator<<(std::ostream &output, const ctx::Mac &mac); + bool operator==(const ctx::Mac &m1, const ctx::Mac &m2); + bool operator!=(const ctx::Mac &m1, const ctx::Mac &m2); + bool operator<(const ctx::Mac &m1, const ctx::Mac &m2); + bool operator>(const ctx::Mac &m1, const ctx::Mac &m2); + +} /* namespace ctx */ + +namespace std { + + template <> struct hash { + size_t operator()(const ctx::Mac & m) const { + size_t h = 1; + for (size_t i = 0; i < ctx::Mac::MAC_SIZE; i++) { + h = h * 37 + m.c[i]; + } + return h; + } + }; + +} /* namespace std */ + +namespace ctx { + + typedef float share_t; + typedef int count_t; + + typedef std::unordered_map Macs2Counts; + typedef std::unordered_map Macs2Shares; + + typedef std::unordered_set MacSet; + + std::istream &operator>>(std::istream &input, ctx::MacSet &macSet); + std::ostream &operator<<(std::ostream &output, const ctx::MacSet &macSet); + ctx::MacSet macSetFromString(const std::string &str); + + std::shared_ptr macSetsUnion(const std::vector> &macSets); + + struct Interval { + time_t start; + time_t end; + + Interval(time_t start, time_t end); + }; + +} /* namespace ctx */ + +namespace std { + + template <> struct hash { + size_t operator()(const ctx::Interval & interval) const { + return interval.end * interval.start; + } + }; + +} /* namespace std */ + +namespace ctx { + + /* + * fully describes interval data after the interval is finished + */ + struct Frame { + Interval interval; + count_t numberOfTimestamps; + Macs2Counts macs2Counts; + + Frame(Interval interval_) : interval(interval_), numberOfTimestamps(0) {}; + }; + + /* + * mac address + its timestamp + */ + struct MacEvent { + time_t timestamp; + Mac mac; + + MacEvent(time_t timestamp_, Mac mac_) : timestamp(timestamp_), mac(mac_) {} + }; + + typedef std::map Categs; // scores of categories + + struct Location { + double latitude; + double longitude; + double accuracy; // [m] + + Location(double latitude_ = 0.0, double longitude_ = 0.0, double accuracy_ = -1.0) + : latitude(latitude_), longitude(longitude_), accuracy(accuracy_) {} + + }; /* struct Location */ + +#ifdef TIZEN_ENGINEER_MODE + enum LocationSource { + LOCATION_METHOD_REQUEST = 0, + LOCATION_METHOD_GET_LOCATION = 1, + LOCATION_METHOD_GET_LAST_LOCATION = 2 + }; +#endif /* TIZEN_ENGINEER_MODE */ + + /* + * location + timestamp + method + */ + struct LocationEvent { + Location coordinates; + time_t timestamp; + +#ifdef TIZEN_ENGINEER_MODE + LocationSource method; + + LocationEvent(double latitude_, double longitude_, double accuracy_, time_t timestamp_, LocationSource method_) : + coordinates(latitude_, longitude_, accuracy_), + timestamp(timestamp_), method(method_) {} +#else /* TIZEN_ENGINEER_MODE */ + LocationEvent(double latitude_, double longitude_, double accuracy_, time_t timestamp_) : + coordinates(latitude_, longitude_, accuracy_), + timestamp(timestamp_) {} +#endif /* TIZEN_ENGINEER_MODE */ + + void log(); + + }; /* struct LocationEvent */ + + struct Visit { + Interval interval; + std::shared_ptr macSet; + Categs categs; + bool locationValid; + Location location; // makes sense if locationValid == true; + + Visit(Interval interval_, std::shared_ptr macSet_ = std::make_shared(), Categs categs_ = Categs()) : + interval(interval_), + macSet(macSet_), + categs(categs_), + locationValid(false) {} + void setLocation(Location location); + void printShort2Stream(std::ostream &out) const; + + }; /* struct Visit */ + + bool operator==(const Visit &v1, const Visit &v2); + typedef std::vector Visits; + typedef std::vector MacEvents; // used to store current interval logs + + std::shared_ptr macSetFromMacs2Counts(const Macs2Counts &macs2Counts); + + typedef float confidence_t; + + class Place { + + public: + PlaceCategId categId; // category of a place (work/home/other) + confidence_t categConfidence; // confidence of the above category - between [0,1] + std::string name; // for now: "work"/"home"/"other" + bool locationValid; + Location location; // makes sense if locationValid == true; + std::string wifiAps; // WiFi APs MAC addresses separated by "," + time_t createDate; // The last update time of this place + + void print2Stream(std::ostream &out) const; + + }; /* class Place */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_USER_PLACES_TYPES_H_ */ diff --git a/src/my-place/user_places/visit_categer.cpp b/src/my-place/user_places/visit_categer.cpp new file mode 100644 index 0000000..1d4c0c6 --- /dev/null +++ b/src/my-place/user_places/visit_categer.cpp @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "visit_categer.h" +#include "mahal.h" +#include +#include "../place_recognition_types.h" +#include "prob_features_model.h" +#include + +// categorizer model parameters trained offline (implemented in python): +const std::map ctx::VisitCateger::__models({ +{ + PLACE_CATEG_ID_HOME, + ctx::MahalModel( + { + 0.588408417316, 0.475154840361, -0.564085141865, 0.077711893790, 0.782630398597, -0.650926403250, -0.101943950378 + }, + { + 0.797977863370, -0.133179879257, 0.242803062646, -0.059448581046, -0.117039646748, 0.097645535057, 0.014250290052, + -0.133179879257, 1.028900241400, -0.252245407243, 0.058455883835, -0.283950879851, 0.172204076583, 0.247906065767, + 0.242803062646, -0.252245407243, 1.832134785177, 0.327188225606, 0.874905851092, -0.371088938012, -1.289816938938, + -0.059448581046, 0.058455883835, 0.327188225606, 1.455090164348, 0.138363721074, 0.216985279422, -1.113021128017, + -0.117039646748, -0.283950879851, 0.874905851092, 0.138363721074, 1.379674755873, -0.977922749615, -0.738895486376, + 0.097645535057, 0.172204076583, -0.371088938012, 0.216985279422, -0.977922749615, 0.899928922718, -0.158101631251, + 0.014250290052, 0.247906065767, -1.289816938938, -1.113021128017, -0.738895486376, -0.158101631251, 2.644105309746 + }) +}, +{ + PLACE_CATEG_ID_WORK, + ctx::MahalModel( + { + -0.128092670982, -0.762177819157, 0.262924477521, -0.412038966097, -1.049141893517, 1.104760800499, -0.628939955525 + }, + { + 15.751249839350, 11.389025401325, -9.885346240379, -0.010809392387, -1.308837060762, 0.970778241189, 0.558946631235, + 11.389025401325, 12.830223040140, -8.517695939156, 0.293693134532, -0.845784968295, 1.418175236596, -2.246658259974, + -9.885346240379, -8.517695939156, 10.222750966685, 0.390448668966, 1.095218945062, -0.403733435617, -1.815103304859, + -0.010809392387, 0.293693134532, 0.390448668966, 2.256864603458, 0.632080300647, -0.019551779384, -1.751417951792, + -1.308837060762, -0.845784968295, 1.095218945062, 0.632080300647, 3.132753467561, -1.427748733399, -4.291958669471, + 0.970778241189, 1.418175236596, -0.403733435617, -0.019551779384, -1.427748733399, 1.183055586213, 0.200571452172, + 0.558946631235, -2.246658259974, -1.815103304859, -1.751417951792, -4.291958669471, 0.200571452172, 11.668888615934 + }) +}, +{ + PLACE_CATEG_ID_OTHER, + ctx::MahalModel( + { + -0.542340098504, 0.184789511765, 0.387451546413, 0.301902661472, 0.109392397093, -0.310468874039, 0.709513920221 + }, + { + 2.153884992301, -0.129488409324, 0.136236052776, -0.138043678532, -0.227492557156, 0.117810812390, 0.265072329266, + -0.129488409324, 3.165213522741, -1.751520714507, 0.467831090302, -0.483916138161, 0.376293684450, 0.149387541935, + 0.136236052776, -1.751520714507, 2.483475248800, 0.384085303028, 0.338642175318, -0.052000492068, -0.801404345627, + -0.138043678532, 0.467831090302, 0.384085303028, 1.972390458477, -0.025332052563, 0.393845805027, -1.225948397955, + -0.227492557156, -0.483916138161, 0.338642175318, -0.025332052563, 0.890301343360, -0.549163112351, -0.746838701215, + 0.117810812390, 0.376293684450, -0.052000492068, 0.393845805027, -0.549163112351, 0.474674836872, 0.012417969474, + 0.265072329266, 0.149387541935, -0.801404345627, -1.225948397955, -0.746838701215, 0.012417969474, 2.104629121515 + }) +}}); + +ctx::PiecewiseLin ctx::VisitCateger::__chiApprox( +{ + 0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, + 0.09, 0.1 , 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, + 0.18, 0.19, 0.2 , 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, + 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32, 0.33, 0.34, 0.35, + 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43, 0.44, + 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, + 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, + 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, + 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8 , + 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, + 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, + 0.99, 1. , 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, + 1.08, 1.09, 1.1 , 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, + 1.17, 1.18, 1.19, 1.2 , 1.21, 1.22, 1.23, 1.24, 1.25, + 1.26, 1.27, 1.28, 1.29, 1.3 , 1.31, 1.32, 1.33, 1.34, + 1.35, 1.36, 1.37, 1.38, 1.39, 1.4 , 1.41, 1.42, 1.43, + 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5 , 1.51, 1.52, + 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.6 , 1.61, + 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.7 , + 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79, + 1.8 , 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, + 1.89, 1.9 , 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, + 1.98, 1.99, 2. , 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, + 2.07, 2.08, 2.09, 2.1 , 2.11, 2.12, 2.13, 2.14, 2.15, + 2.16, 2.17, 2.18, 2.19, 2.2 , 2.21, 2.22, 2.23, 2.24, + 2.25, 2.26, 2.27, 2.28, 2.29, 2.3 , 2.31, 2.32, 2.33, + 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4 , 2.41, 2.42, + 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5 , 2.51, + 2.52, 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59, 2.6 , + 2.61, 2.62, 2.63, 2.64, 2.65, 2.66, 2.67, 2.68, 2.69, + 2.7 , 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 2.77, 2.78, + 2.79, 2.8 , 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, + 2.88, 2.89, 2.9 , 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, + 2.97, 2.98, 2.99, 3. , 3.01, 3.02, 3.03, 3.04, 3.05, + 3.06, 3.07, 3.08, 3.09, 3.1 , 3.11, 3.12, 3.13, 3.14, + 3.15, 3.16, 3.17, 3.18, 3.19, 3.2 , 3.21, 3.22, 3.23, + 3.24, 3.25, 3.26, 3.27, 3.28, 3.29, 3.3 , 3.31, 3.32, + 3.33, 3.34, 3.35, 3.36, 3.37, 3.38, 3.39, 3.4 , 3.41, + 3.42, 3.43, 3.44, 3.45, 3.46, 3.47, 3.48, 3.49, 3.5 , + 3.51, 3.52, 3.53, 3.54, 3.55, 3.56, 3.57, 3.58, 3.59, + 3.6 , 3.61, 3.62, 3.63, 3.64, 3.65, 3.66, 3.67, 3.68, + 3.69, 3.7 , 3.71, 3.72, 3.73, 3.74, 3.75, 3.76, 3.77, + 3.78, 3.79, 3.8 , 3.81, 3.82, 3.83, 3.84, 3.85, 3.86, + 3.87, 3.88, 3.89, 3.9 , 3.91, 3.92, 3.93, 3.94, 3.95, + 3.96, 3.97, 3.98, 3.99, 4. , 4.01, 4.02, 4.03, 4.04, + 4.05, 4.06, 4.07, 4.08, 4.09, 4.1 , 4.11, 4.12, 4.13, + 4.14, 4.15, 4.16, 4.17, 4.18, 4.19, 4.2 , 4.21, 4.22, + 4.23, 4.24, 4.25, 4.26, 4.27, 4.28, 4.29, 4.3 , 4.31, + 4.32, 4.33, 4.34, 4.35, 4.36, 4.37, 4.38, 4.39, 4.4 , + 4.41, 4.42, 4.43, 4.44, 4.45, 4.46, 4.47, 4.48, 4.49, + 4.5 , 4.51, 4.52, 4.53, 4.54, 4.55, 4.56, 4.57, 4.58, + 4.59, 4.6 , 4.61, 4.62, 4.63, 4.64, 4.65, 4.66, 4.67, + 4.68, 4.69, 4.7 , 4.71, 4.72, 4.73, 4.74, 4.75, 4.76, + 4.77, 4.78, 4.79, 4.8 , 4.81, 4.82, 4.83, 4.84, 4.85, + 4.86, 4.87, 4.88, 4.89, 4.9 , 4.91, 4.92, 4.93, 4.94, + 4.95, 4.96, 4.97, 4.98, 4.99, 5. , 5.01, 5.02, 5.03, + 5.04, 5.05, 5.06, 5.07, 5.08, 5.09, 5.1 , 5.11, 5.12, + 5.13, 5.14, 5.15, 5.16, 5.17, 5.18, 5.19, 5.2 , 5.21, + 5.22, 5.23, 5.24, 5.25, 5.26, 5.27, 5.28, 5.29, 5.3 , + 5.31, 5.32, 5.33, 5.34, 5.35, 5.36, 5.37, 5.38, 5.39, + 5.4 , 5.41, 5.42, 5.43, 5.44, 5.45, 5.46, 5.47, 5.48, + 5.49, 5.5 , 5.51, 5.52, 5.53, 5.54, 5.55, 5.56, 5.57, + 5.58, 5.59, 5.6 , 5.61, 5.62, 5.63, 5.64, 5.65, 5.66, + 5.67, 5.68, 5.69, 5.7 , 5.71, 5.72, 5.73, 5.74, 5.75, + 5.76, 5.77, 5.78, 5.79, 5.8 , 5.81, 5.82, 5.83, 5.84, + 5.85, 5.86, 5.87, 5.88, 5.89, 5.9 , 5.91, 5.92, 5.93, + 5.94, 5.95, 5.96, 5.97, 5.98, 5.99, 6. , 6.01, 6.02, + 6.03, 6.04, 6.05, 6.06, 6.07, 6.08, 6.09, 6.1 , 6.11, + 6.12, 6.13, 6.14, 6.15, 6.16, 6.17, 6.18, 6.19, 6.2 , + 6.21, 6.22, 6.23, 6.24, 6.25, 6.26, 6.27, 6.28, 6.29, + 6.3 , 6.31, 6.32, 6.33, 6.34, 6.35, 6.36, 6.37, 6.38, + 6.39, 6.4 , 6.41, 6.42, 6.43, 6.44, 6.45, 6.46, 6.47, + 6.48, 6.49, 6.5 , 6.51, 6.52, 6.53, 6.54, 6.55, 6.56, + 6.57, 6.58, 6.59, 6.6 , 6.61, 6.62, 6.63, 6.64, 6.65, + 6.66, 6.67, 6.68, 6.69, 6.7 , 6.71, 6.72, 6.73, 6.74, + 6.75, 6.76, 6.77, 6.78, 6.79, 6.8 , 6.81, 6.82, 6.83, + 6.84, 6.85, 6.86, 6.87, 6.88, 6.89, 6.9 , 6.91, 6.92, + 6.93, 6.94, 6.95, 6.96, 6.97, 6.98, 6.99, 7. +}, +{ + 0. , 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0.000001, 0.000001, 0.000001, 0.000001, + 0.000002, 0.000002, 0.000003, 0.000003, 0.000004, 0.000005, + 0.000006, 0.000007, 0.000008, 0.00001 , 0.000012, 0.000014, + 0.000016, 0.000019, 0.000023, 0.000026, 0.000031, 0.000035, + 0.000041, 0.000047, 0.000054, 0.000062, 0.00007 , 0.00008 , + 0.000091, 0.000103, 0.000116, 0.000131, 0.000147, 0.000165, + 0.000185, 0.000207, 0.000231, 0.000257, 0.000285, 0.000316, + 0.00035 , 0.000387, 0.000427, 0.000471, 0.000518, 0.000569, + 0.000624, 0.000683, 0.000747, 0.000816, 0.00089 , 0.00097 , + 0.001055, 0.001147, 0.001245, 0.001349, 0.001461, 0.00158 , + 0.001708, 0.001843, 0.001987, 0.002141, 0.002303, 0.002476, + 0.002659, 0.002854, 0.003059, 0.003276, 0.003506, 0.003748, + 0.004004, 0.004274, 0.004558, 0.004857, 0.005171, 0.005502, + 0.00585 , 0.006215, 0.006597, 0.006999, 0.007419, 0.007859, + 0.00832 , 0.008802, 0.009305, 0.009831, 0.01038 , 0.010953, + 0.01155 , 0.012172, 0.01282 , 0.013495, 0.014197, 0.014927, + 0.015686, 0.016473, 0.017291, 0.01814 , 0.019021, 0.019933, + 0.020879, 0.021858, 0.022872, 0.023921, 0.025006, 0.026127, + 0.027285, 0.028482, 0.029717, 0.030992, 0.032306, 0.033662, + 0.035059, 0.036497, 0.037979, 0.039504, 0.041073, 0.042687, + 0.044345, 0.04605 , 0.047801, 0.049599, 0.051445, 0.053339, + 0.055282, 0.057273, 0.059315, 0.061406, 0.063548, 0.065742, + 0.067986, 0.070283, 0.072632, 0.075034, 0.077488, 0.079996, + 0.082558, 0.085174, 0.087843, 0.090568, 0.093346, 0.09618 , + 0.099069, 0.102013, 0.105012, 0.108066, 0.111176, 0.114342, + 0.117563, 0.120839, 0.124171, 0.127558, 0.131001, 0.134499, + 0.138052, 0.141659, 0.145322, 0.149039, 0.15281 , 0.156635, + 0.160514, 0.164446, 0.168431, 0.172469, 0.176559, 0.180701, + 0.184894, 0.189138, 0.193432, 0.197776, 0.202169, 0.206611, + 0.211101, 0.215639, 0.220223, 0.224853, 0.229528, 0.234248, + 0.239012, 0.24382 , 0.248669, 0.25356 , 0.258492, 0.263464, + 0.268474, 0.273523, 0.278608, 0.283731, 0.288888, 0.29408 , + 0.299305, 0.304562, 0.309851, 0.31517 , 0.320519, 0.325895, + 0.331299, 0.336729, 0.342185, 0.347664, 0.353166, 0.35869 , + 0.364234, 0.369798, 0.375381, 0.38098 , 0.386596, 0.392227, + 0.397871, 0.403529, 0.409197, 0.414876, 0.420565, 0.426261, + 0.431964, 0.437673, 0.443387, 0.449103, 0.454822, 0.460543, + 0.466263, 0.471981, 0.477698, 0.483411, 0.48912 , 0.494822, + 0.500518, 0.506206, 0.511886, 0.517554, 0.523212, 0.528858, + 0.53449 , 0.540108, 0.545711, 0.551297, 0.556866, 0.562417, + 0.567948, 0.573459, 0.578949, 0.584417, 0.589861, 0.595282, + 0.600677, 0.606048, 0.611391, 0.616707, 0.621995, 0.627254, + 0.632483, 0.637681, 0.642848, 0.647984, 0.653086, 0.658155, + 0.66319 , 0.66819 , 0.673155, 0.678084, 0.682976, 0.687831, + 0.692649, 0.697428, 0.702168, 0.70687 , 0.711531, 0.716153, + 0.720733, 0.725273, 0.729772, 0.734228, 0.738643, 0.743015, + 0.747344, 0.75163 , 0.755873, 0.760072, 0.764227, 0.768339, + 0.772406, 0.776428, 0.780406, 0.784339, 0.788228, 0.792071, + 0.795869, 0.799622, 0.80333 , 0.806992, 0.810609, 0.814181, + 0.817707, 0.821188, 0.824624, 0.828015, 0.83136 , 0.83466 , + 0.837916, 0.841126, 0.844292, 0.847413, 0.85049 , 0.853522, + 0.85651 , 0.859455, 0.862355, 0.865212, 0.868026, 0.870796, + 0.873524, 0.876209, 0.878852, 0.881452, 0.884011, 0.886528, + 0.889005, 0.89144 , 0.893834, 0.896189, 0.898503, 0.900778, + 0.903014, 0.90521 , 0.907369, 0.909488, 0.911571, 0.913615, + 0.915623, 0.917594, 0.919528, 0.921427, 0.92329 , 0.925118, + 0.926911, 0.92867 , 0.930395, 0.932086, 0.933745, 0.93537 , + 0.936963, 0.938525, 0.940055, 0.941554, 0.943022, 0.94446 , + 0.945869, 0.947248, 0.948598, 0.949919, 0.951213, 0.952478, + 0.953717, 0.954928, 0.956113, 0.957273, 0.958406, 0.959514, + 0.960598, 0.961657, 0.962692, 0.963703, 0.964692, 0.965657, + 0.9666 , 0.967521, 0.968421, 0.969299, 0.970156, 0.970993, + 0.97181 , 0.972607, 0.973385, 0.974144, 0.974884, 0.975605, + 0.976309, 0.976996, 0.977665, 0.978317, 0.978953, 0.979572, + 0.980176, 0.980764, 0.981337, 0.981895, 0.982438, 0.982967, + 0.983482, 0.983984, 0.984472, 0.984947, 0.985409, 0.985858, + 0.986296, 0.986721, 0.987135, 0.987537, 0.987929, 0.988309, + 0.988678, 0.989038, 0.989387, 0.989726, 0.990056, 0.990376, + 0.990687, 0.990989, 0.991282, 0.991566, 0.991843, 0.992111, + 0.992371, 0.992624, 0.992869, 0.993106, 0.993337, 0.99356 , + 0.993777, 0.993988, 0.994191, 0.994389, 0.99458 , 0.994766, + 0.994946, 0.99512 , 0.995289, 0.995452, 0.99561 , 0.995764, + 0.995912, 0.996056, 0.996195, 0.996329, 0.99646 , 0.996586, + 0.996708, 0.996825, 0.996939, 0.99705 , 0.997156, 0.99726 , + 0.997359, 0.997456, 0.997549, 0.997639, 0.997726, 0.99781 , + 0.997891, 0.997969, 0.998045, 0.998118, 0.998189, 0.998257, + 0.998323, 0.998386, 0.998447, 0.998506, 0.998563, 0.998618, + 0.998671, 0.998723, 0.998772, 0.998819, 0.998865, 0.998909, + 0.998952, 0.998993, 0.999033, 0.999071, 0.999107, 0.999143, + 0.999177, 0.99921 , 0.999241, 0.999272, 0.999301, 0.999329, + 0.999356, 0.999382, 0.999407, 0.999431, 0.999455, 0.999477, + 0.999498, 0.999519, 0.999539, 0.999558, 0.999576, 0.999594, + 0.999611, 0.999627, 0.999643, 0.999658, 0.999672, 0.999686, + 0.999699, 0.999712, 0.999724, 0.999736, 0.999747, 0.999758, + 0.999769, 0.999779, 0.999788, 0.999797, 0.999806, 0.999815, + 0.999823, 0.99983 , 0.999838, 0.999845, 0.999852, 0.999858, + 0.999865, 0.999871, 0.999876, 0.999882, 0.999887, 0.999892, + 0.999897, 0.999902, 0.999906, 0.99991 , 0.999915, 0.999918, + 0.999922, 0.999926, 0.999929, 0.999932, 0.999936, 0.999938, + 0.999941, 0.999944, 0.999947, 0.999949, 0.999952, 0.999954, + 0.999956, 0.999958, 0.99996 , 0.999962, 0.999964, 0.999965, + 0.999967, 0.999969, 0.99997 , 0.999972, 0.999973, 0.999974, + 0.999975, 0.999977, 0.999978, 0.999979, 0.99998 , 0.999981, + 0.999982, 0.999983, 0.999984, 0.999984, 0.999985, 0.999986, + 0.999987, 0.999987, 0.999988, 0.999988, 0.999989, 0.99999 , + 0.99999 , 0.999991, 0.999991, 0.999992, 0.999992, 0.999992, + 0.999993, 0.999993, 0.999993, 0.999994, 0.999994, 0.999994, + 0.999995, 0.999995, 0.999995, 0.999995, 0.999996, 0.999996, + 0.999996, 0.999996, 0.999997, 0.999997, 0.999997, 0.999997, + 0.999997, 0.999997, 0.999998, 0.999998, 0.999998, 0.999998, + 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, + 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, + 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, + 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, + 0.999999, 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. +} // this is chi cdf for 7 degrees of freedom (because we have 7 features) +); + +const std::vector ctx::VisitCateger::__featuresMean( +{ + 344.542975696503, + 894.178423236515, + 868.300533491405, + 2.820391227030, + 0.511747454052, + 0.348669092762, + 0.139583453187 +}); + +const std::vector ctx::VisitCateger::__featuresStd( +{ + 416.061437196941, + 301.401812101781, + 300.774466281622, + 1.916233112930, + 0.314254748759, + 0.360707461975, + 0.109386661911 +}); + +ctx::TimeFeatures ctx::VisitCateger::timeFeatures(const time_t &time) +{ + struct tm *timeinfo = localtime(&time); + if (timeinfo == NULL) { + return {0, 0, 0, false}; + } + int minutesSinceMidnight = 60 * timeinfo->tm_hour + timeinfo->tm_min; + int weekday = (timeinfo->tm_wday + 6) % 7; // Monday is 0, Sunday is 6 + bool weekend = weekday > 4; + int minutesSinceBeginingOfTheWeek = 24 * 60 * weekday + minutesSinceMidnight; + return { + minutesSinceMidnight, + minutesSinceBeginingOfTheWeek, + weekday, + weekend + }; +} + +int ctx::VisitCateger::weeksScope(const TimeFeatures &startF, const Interval &interval) +{ + int durationMinutes = (interval.end - interval.start) / 60; + int scopeMinutes = startF.minutesSinceBeginingOfTheWeek + durationMinutes; + int weeksScope = scopeMinutes / __MINUTES_IN_WEEK; + if (scopeMinutes % __MINUTES_IN_WEEK > 0) { + weeksScope++; + } + return weeksScope; +} + +ctx::num_t ctx::VisitCateger::__sum(const std::vector model, const size_t &from, const size_t &to) +{ + size_t toSecure = to; + if (to >= model.size()) { + _E("'to' exceeds model size"); + toSecure = model.size() - 1; + } + + if (from > to) { + _E("'from' greater than 'to'"); + } + + num_t result = 0.0; + for (size_t i = from; i <= toSecure; i++) { + result += model[i]; + } + + return result; +} + +ctx::num_t ctx::VisitCateger::__weekModelMeanValue(PlaceCategId categ, const Interval &interval, + const TimeFeatures &startF, const TimeFeatures &endF) +{ + num_t ret = 0.0; + int minutes = 0; + int ws = weeksScope(startF, interval); + for (int week = 1; week <= ws; week++) { + size_t startIndex = (week == 1) + ? startF.minutesSinceBeginingOfTheWeek + : 0; + size_t endIndex = (week == ws) + ? endF.minutesSinceBeginingOfTheWeek + : __MINUTES_IN_WEEK - 1; + ret += __sum(prob_features::weekModel[categ], startIndex, endIndex); + minutes += endIndex - startIndex + 1; + } + if (minutes > 0) { + return ret / minutes; + } + return ret; +} + +ctx::Categs ctx::VisitCateger::weekModelFeatures(const Interval &interval, const TimeFeatures &startF, const TimeFeatures &endF) +{ + ctx::Categs categs; + for (const auto &item : prob_features::weekModel) { + categs[item.first] = __weekModelMeanValue(item.first, interval, startF, endF); + } + _D("categs: H=%.12f, W=%.12f, O=%.12f", + categs[PLACE_CATEG_ID_HOME], + categs[PLACE_CATEG_ID_WORK], + categs[PLACE_CATEG_ID_OTHER]); + return categs; +} + +ctx::IntervalFeatures ctx::VisitCateger::intervalFeatures(const Interval &interval) +{ + num_t durationMinutes = 1.0 * (interval.end - interval.start) / 60; + TimeFeatures startFeatures = timeFeatures(interval.start); + TimeFeatures endFeatures = timeFeatures(interval.end); + Categs weekFeatures = weekModelFeatures(interval, startFeatures, endFeatures); + return { + durationMinutes, + (num_t) startFeatures.minutesSinceMidnight, + (num_t) endFeatures.minutesSinceMidnight, + (num_t) startFeatures.weekday, + weekFeatures[PLACE_CATEG_ID_HOME], + weekFeatures[PLACE_CATEG_ID_WORK], + weekFeatures[PLACE_CATEG_ID_OTHER] + }; +} + +void ctx::VisitCateger::__normalize(std::vector &features) +{ + size_t n = features.size(); + for (size_t i = 0; i < n; i++) { + features[i] -= __featuresMean[i]; + features[i] /= __featuresStd[i]; + } +} + +void ctx::VisitCateger::categorize(ctx::Visit &visit) +{ + IntervalFeatures features = intervalFeatures(visit.interval); + __normalize(features); + + for (auto &modelPair : __models) { + int categId = modelPair.first; + MahalModel model = modelPair.second; + + num_t distance = model.distance(features); + num_t probability = 1 - __chiApprox.value(distance); // sth like probability but not exactly + visit.categs[categId] = probability; + } +} diff --git a/src/my-place/user_places/visit_categer.h b/src/my-place/user_places/visit_categer.h new file mode 100644 index 0000000..b9d4940 --- /dev/null +++ b/src/my-place/user_places/visit_categer.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_VISIT_CATEGER_H_ +#define _CONTEXT_PLACE_RECOGNITION_VISIT_CATEGER_H_ + +#include "user_places_types.h" +#include "mahal.h" +#include "piecewise_lin.h" +#include + +namespace ctx { + + struct TimeFeatures { + int minutesSinceMidnight; + int minutesSinceBeginingOfTheWeek; + int weekday; + bool weekend; + }; + + typedef std::vector IntervalFeatures; + + /* + * visit categorizer class + */ + class VisitCateger { + + private: + static const int __MINUTES_IN_WEEK = 60 * 24 * 7; + static const std::map __models; + static const std::vector __featuresMean; + static const std::vector __featuresStd; + static num_t __sum(const std::vector model, const size_t &from, const size_t &to); + static num_t __weekModelMeanValue(PlaceCategId categ, const Interval &interval, + const TimeFeatures &startF, const TimeFeatures &endF); + static void __normalize(std::vector &features); + static PiecewiseLin __chiApprox; // tabled chi function approximator + + public: + /** + * Function interpret time in timestamp input argument, + * + * @param time timestamp + * @return TimeFeatures structure with interpretations of timestamp + */ + static TimeFeatures timeFeatures(const time_t &time); + + static int weeksScope(const TimeFeatures &startF, const Interval &interval); + + /** + * Function interpret time interval input argument and calculates scores + * that argument interval is home, work or other based on whole week model. + * + * @param interval time interval + * @param startF start time features + * @param endF end time features + * @return Categs score that argument interval is home, work or other + */ + static Categs weekModelFeatures(const Interval &interval, const TimeFeatures &startF, + const TimeFeatures &endF); + + /** + * Function interpret time interval input argument, + * + * @param interval time interval + * @return IntervalFeatures vector with interpretations of input time interval + */ + static IntervalFeatures intervalFeatures(const Interval &interval); + + /** + * Function categorize visit based on visits time interval and fill its categories values. + */ + static void categorize(ctx::Visit &visit); + + }; /* class VisitCateger */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_VISIT_CATEGER_H_ */ diff --git a/src/my-place/user_places/visit_detector.cpp b/src/my-place/user_places/visit_detector.cpp new file mode 100644 index 0000000..e0ba642 --- /dev/null +++ b/src/my-place/user_places/visit_detector.cpp @@ -0,0 +1,444 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include +#include +#include +#include "../place_recognition_types.h" +#include "visit_detector.h" +#include "user_places_params.h" +#include "visit_categer.h" +#include "similarity.h" +#include "median.h" +#include "debug_utils.h" + +#ifdef TIZEN_ENGINEER_MODE +#define __VISIT_TABLE_COLUMNS \ + VISIT_COLUMN_WIFI_APS " TEXT, "\ + VISIT_COLUMN_START_TIME " timestamp, "\ + VISIT_COLUMN_END_TIME " timestamp, "\ + VISIT_COLUMN_START_TIME_HUMAN " TEXT, "\ + VISIT_COLUMN_END_TIME_HUMAN " TEXT, "\ + VISIT_COLUMN_LOCATION_VALID " INTEGER, "\ + VISIT_COLUMN_LOCATION_LATITUDE " REAL, "\ + VISIT_COLUMN_LOCATION_LONGITUDE " REAL, "\ + VISIT_COLUMN_CATEG_HOME " REAL, "\ + VISIT_COLUMN_CATEG_WORK " REAL, "\ + VISIT_COLUMN_CATEG_OTHER " REAL" +#else /* TIZEN_ENGINEER_MODE */ +#define __VISIT_TABLE_COLUMNS \ + VISIT_COLUMN_WIFI_APS " TEXT, "\ + VISIT_COLUMN_START_TIME " timestamp, "\ + VISIT_COLUMN_END_TIME " timestamp, "\ + VISIT_COLUMN_LOCATION_VALID " INTEGER, "\ + VISIT_COLUMN_LOCATION_LATITUDE " REAL, "\ + VISIT_COLUMN_LOCATION_LONGITUDE " REAL, "\ + VISIT_COLUMN_CATEG_HOME " REAL, "\ + VISIT_COLUMN_CATEG_WORK " REAL, "\ + VISIT_COLUMN_CATEG_OTHER " REAL" +#endif /* TIZEN_ENGINEER_MODE */ + +ctx::VisitDetector::VisitDetector(time_t startScan, PlaceRecogMode energyMode, bool testMode) : + __testMode(testMode), + __locationLogger(this, testMode), + __wifiLogger(this, energyMode, testMode), + __currentInterval(startScan, startScan + VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY), + __stableCounter(0), + __tolerance(VISIT_DETECTOR_TOLERANCE_DEPTH), + __entranceToPlace(false), + __periodSeconds(VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY), + __entranceTime(0), + __departureTime(0) +{ + __setPeriod(energyMode); + __currentInterval = Interval(startScan, startScan + __periodSeconds); + __currentMacEvents = std::make_shared(); + __stayMacs = std::make_shared(); + + if (__testMode) { + __detectedVisits = std::make_shared(); + return; + } + + __listeners.push_back(&__locationLogger); + __listeners.push_back(&__wifiLogger); + __dbCreateTable(); + __wifiLogger.startLogging(); +} + +ctx::VisitDetector::~VisitDetector() +{ +} + +bool ctx::VisitDetector::__isValid(const ctx::Mac &mac) +{ + return mac != "00:00:00:00:00:00"; +} + +void ctx::VisitDetector::onWifiScan(ctx::MacEvent e) +{ + _D("timestamp=%d, curent_interval.end=%d, mac=%s", e.timestamp, __currentInterval.end, std::string(e.mac).c_str()); + if (__isValid(e.mac)) { + while (e.timestamp > __currentInterval.end) { + __processCurrentLogger(); + __shiftCurrentInterval(); + } + __currentMacEvents->push_back(e); + } +} + +void ctx::VisitDetector::__processCurrentLogger() +{ + _D(""); + std::shared_ptr frame = __makeFrame(__currentMacEvents, __currentInterval); + __detectEntranceOrDeparture(frame); + __currentMacEvents->clear(); +} + +std::shared_ptr ctx::VisitDetector::__makeFrame(std::shared_ptr logger, ctx::Interval interval) +{ + std::set timestamps; + std::shared_ptr frame = std::make_shared(interval); + for (auto log : *logger) { + timestamps.insert(log.timestamp); + if (frame->macs2Counts.find(log.mac) == frame->macs2Counts.end()) { + frame->macs2Counts[log.mac] = 1; + } else { + frame->macs2Counts[log.mac] += 1; + } + } + frame->numberOfTimestamps = timestamps.size(); + return frame; +} + +void ctx::VisitDetector::__shiftCurrentInterval() +{ + __currentInterval.end += __periodSeconds; + __currentInterval.start += __periodSeconds; +} + +void ctx::VisitDetector::__detectEntranceOrDeparture(std::shared_ptr frame) +{ + __entranceToPlace ? __detectDeparture(frame) : __detectEntrance(frame); +} + +bool ctx::VisitDetector::__isDisjoint(const ctx::Macs2Counts &macs2Counts, const ctx::MacSet &macSet) +{ + for (auto &mac : macSet) { + if (macs2Counts.find(mac) != macs2Counts.end()) { + return false; + } + } + return true; +} + +bool ctx::VisitDetector::__protrudesFrom(const ctx::Macs2Counts &macs2Counts, const ctx::MacSet &macSet) +{ + for (auto &macCount : macs2Counts) { + if (macSet.find(macCount.first) == macSet.end()) { + return true; + } + } + return false; +} + +void ctx::VisitDetector::__detectDeparture(std::shared_ptr frame) +{ + if (__tolerance == VISIT_DETECTOR_TOLERANCE_DEPTH) { + __departureTime = frame->interval.start; + __bufferedFrames.clear(); + } else { // __tolerance < VISIT_DETECTOR_TOLERANCE_DEPTH + __bufferedFrames.push_back(frame); + } + if (__isDisjoint(frame->macs2Counts, *__representativesMacs)) { + if (frame->macs2Counts.empty() || __protrudesFrom(frame->macs2Counts, *__stayMacs)) { + __tolerance--; + } else { // no new macs + __bufferedFrames.clear(); + } + if (__tolerance == 0) { // departure detected + __visitEndDetected(); + __processBuffer(frame); + } + } else if (__tolerance < VISIT_DETECTOR_TOLERANCE_DEPTH) { + __tolerance++; + } +} + +void ctx::VisitDetector::__visitStartDetected() +{ + __entranceToPlace = true; + + __locationEvents.clear(); + if (!__testMode) { + for (IVisitListener* listener : __listeners) { + listener->onVisitStart(); + } + } + __representativesMacs = __selectRepresentatives(__historyFrames); + __entranceTime = __historyFrames[0]->interval.start; + _I("Entrance detected, timestamp: %d", __entranceTime); + __resetHistory(); +} + +void ctx::VisitDetector::__visitEndDetected() +{ + if (!__testMode) { + for (IVisitListener* listener : __listeners) { + listener->onVisitEnd(); + } + } + _I("Departure detected, timestamp: %d", __departureTime); + + Interval interval(__entranceTime, __departureTime); + Visit visit(interval, __representativesMacs); + VisitCateger::categorize(visit); + + __putLocationToVisit(visit); + + if (__testMode) { + __detectedVisits->push_back(visit); + } else { + __dbInsertVisit(visit); + } + + // cleaning + __entranceToPlace = false; + __representativesMacs.reset(); + __tolerance = VISIT_DETECTOR_TOLERANCE_DEPTH; +} + +void ctx::VisitDetector::__putLocationToVisit(ctx::Visit &visit) +{ + // TODO: remove small accuracy locations from vectors? + std::vector latitudes; + std::vector longitudes; + visit.locationValid = false; + for (LocationEvent location : __locationEvents) { + if (location.timestamp >= __entranceTime && location.timestamp <= __departureTime) { + latitudes.push_back(location.coordinates.latitude); + longitudes.push_back(location.coordinates.longitude); + visit.locationValid = true; + } + } + if (visit.locationValid) { + visit.location.latitude = median(latitudes); + visit.location.longitude = median(longitudes); + _D("visit location set: lat=%.8f, lon=%.8f", visit.location.latitude, visit.location.longitude); + } else { + _D("visit location not set"); + } +} + +void ctx::VisitDetector::__processBuffer(std::shared_ptr frame) +{ + if (__bufferedFrames.empty()) { + __historyFrames.push_back(frame); + } else { + __historyFrames.push_back(__bufferedFrames[0]); + for (size_t i = 1; i < __bufferedFrames.size(); i++) { + __detectEntrance(__bufferedFrames[i]); + if (__entranceToPlace) { + break; + } + } + } +} + +void ctx::VisitDetector::__detectEntrance(std::shared_ptr currentFrame) +{ + if (currentFrame->macs2Counts.empty() || __historyFrames.empty()) { + __resetHistory(currentFrame); + return; + } + + if (__stableCounter == 0) { + std::shared_ptr oldestHistoryFrame = __historyFrames[0]; + __stayMacs = macSetFromMacs2Counts(oldestHistoryFrame->macs2Counts); + } + + std::shared_ptr currentBeacons = macSetFromMacs2Counts(currentFrame->macs2Counts); + + if (similarity::overlapBiggerOverSmaller(*currentBeacons, *__stayMacs) > VISIT_DETECTOR_OVERLAP) { + __stableCounter++; + __historyFrames.push_back(currentFrame); + + if (__stableCounter == VISIT_DETECTOR_STABLE_DEPTH) { // entrance detected + __visitStartDetected(); + } + } else { + __resetHistory(currentFrame); + } + return; +} + +void ctx::VisitDetector::__resetHistory() +{ + __stableCounter = 0; + __historyFrames.clear(); +} + +void ctx::VisitDetector::__resetHistory(std::shared_ptr frame) +{ + __resetHistory(); + __historyFrames.push_back(frame); +} + +std::shared_ptr ctx::VisitDetector::__selectRepresentatives(const std::vector> &frames) +{ + Macs2Counts reprs2Counts; + count_t allCount = 0; + + for (auto frame : frames) { + allCount += frame->numberOfTimestamps; + for (auto &c : frame->macs2Counts) { + reprs2Counts[c.first] += c.second; + } + } + + std::shared_ptr reprs2Shares = __macSharesFromCounts(reprs2Counts, allCount); + + share_t maxShare = __calcMaxShare(*reprs2Shares); + share_t threshold = maxShare < VISIT_DETECTOR_REP_THRESHOLD ? maxShare : VISIT_DETECTOR_REP_THRESHOLD; + + std::shared_ptr reprsMacSet = __macSetOfGreaterOrEqualShare(*reprs2Shares, threshold); + + return reprsMacSet; +} + +ctx::share_t ctx::VisitDetector::__calcMaxShare(const ctx::Macs2Shares &macs2Shares) +{ + ctx::share_t maxShare = 0.0; + for (auto &macShare : macs2Shares) { + if (macShare.second > maxShare) { + maxShare = macShare.second; + } + } + return maxShare; +} + +std::shared_ptr ctx::VisitDetector::__macSetOfGreaterOrEqualShare(const ctx::Macs2Shares &macs2Shares, ctx::share_t threshold) +{ + std::shared_ptr macSet = std::make_shared(); + for (auto &macShare : macs2Shares) { + if (macShare.second >= threshold) { + macSet->insert(macShare.first); + } + } + return macSet; +} + +std::shared_ptr ctx::VisitDetector::__macSharesFromCounts(ctx::Macs2Counts const &macs2Counts, ctx::count_t denominator) +{ + std::shared_ptr macs2Shares(std::make_shared()); + for (auto macCount : macs2Counts) { + (*macs2Shares)[macCount.first] = (share_t) macCount.second / denominator; + } + return macs2Shares; +} + +std::shared_ptr ctx::VisitDetector::getVisits() +{ + return __detectedVisits; +} + +void ctx::VisitDetector::__dbCreateTable() +{ + bool ret = __dbManager.createTable(0, VISIT_TABLE, __VISIT_TABLE_COLUMNS); + _D("db: visit Table Creation Result: %s", ret ? "SUCCESS" : "FAIL"); +} + +void ctx::VisitDetector::__putVisitCategToJson(const char* key, const Categs &categs, int categType, Json &data) +{ + auto categ = categs.find(categType); + if (categ == categs.end()) { + _E("json_put_visit no type %d in categs", categType); + } else { + data.set(NULL, key, categ->second); + } +} + +void ctx::VisitDetector::__putVisitCategsToJson(const Categs &categs, Json &data) +{ + __putVisitCategToJson(VISIT_COLUMN_CATEG_HOME, categs, PLACE_CATEG_ID_HOME, data); + __putVisitCategToJson(VISIT_COLUMN_CATEG_WORK, categs, PLACE_CATEG_ID_WORK, data); + __putVisitCategToJson(VISIT_COLUMN_CATEG_OTHER, categs, PLACE_CATEG_ID_OTHER, data); +} + +int ctx::VisitDetector::__dbInsertVisit(Visit visit) +{ + std::stringstream ss; + ss << *visit.macSet; + + Json data; + data.set(NULL, VISIT_COLUMN_WIFI_APS, ss.str().c_str()); + + data.set(NULL, VISIT_COLUMN_LOCATION_VALID, visit.locationValid); + data.set(NULL, VISIT_COLUMN_LOCATION_LATITUDE, visit.location.latitude); + data.set(NULL, VISIT_COLUMN_LOCATION_LONGITUDE, visit.location.longitude); + + data.set(NULL, VISIT_COLUMN_START_TIME, static_cast(visit.interval.start)); + data.set(NULL, VISIT_COLUMN_END_TIME, static_cast(visit.interval.end)); + +#ifdef TIZEN_ENGINEER_MODE + std::string startTimeHuman = DebugUtils::humanReadableDateTime(visit.interval.start, "%F %T", 80); + std::string endTimeHuman = DebugUtils::humanReadableDateTime(visit.interval.end, "%F %T", 80); + data.set(NULL, VISIT_COLUMN_START_TIME_HUMAN, startTimeHuman.c_str()); + data.set(NULL, VISIT_COLUMN_END_TIME_HUMAN, endTimeHuman.c_str()); + _D("db: visit table insert interval: (%d, %d): (%s, %s)", + visit.interval.start, visit.interval.end, startTimeHuman.c_str(), endTimeHuman.c_str()); +#else + _D("db: visit table insert interval: (%d, %d)", visit.interval.start, visit.interval.end); +#endif /* TIZEN_ENGINEER_MODE */ + + __putVisitCategsToJson(visit.categs, data); + + int64_t rowId; + bool ret = __dbManager.insertSync(VISIT_TABLE, data, &rowId); + _D("db: visit table insert result: %s", ret ? "SUCCESS" : "FAIL"); + return ret; +} + +void ctx::VisitDetector::onNewLocation(LocationEvent locationEvent) +{ + _D(""); + locationEvent.log(); + __locationEvents.push_back(locationEvent); +}; + +void ctx::VisitDetector::__setPeriod(PlaceRecogMode energyMode) +{ + switch (energyMode) { + case PLACE_RECOG_LOW_POWER_MODE: + __periodSeconds = VISIT_DETECTOR_PERIOD_SECONDS_LOW_POWER; + break; + case PLACE_RECOG_HIGH_ACCURACY_MODE: + __periodSeconds = VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY; + break; + default: + _E("Incorrect energy mode"); + } +} + +void ctx::VisitDetector::setMode(PlaceRecogMode energyMode) +{ + _D(""); + __setPeriod(energyMode); + __wifiLogger.setMode(energyMode); +} diff --git a/src/my-place/user_places/visit_detector.h b/src/my-place/user_places/visit_detector.h new file mode 100644 index 0000000..ee6e7c2 --- /dev/null +++ b/src/my-place/user_places/visit_detector.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_VISIT_DETECTOR_H_ +#define _CONTEXT_PLACE_RECOGNITION_VISIT_DETECTOR_H_ + +#include +#include +#include +#include +#include +#include "user_places_types.h" +#include +#include +#include "visit_listener_iface.h" +#include "location_logger.h" +#include "location_listener_iface.h" +#include "wifi_listener_iface.h" +#include "wifi_logger.h" + +namespace ctx { + + class VisitDetector : public IWifiListener, ILocationListener { + + private: + bool __testMode; + std::shared_ptr __detectedVisits; // only used in test mode + LocationLogger __locationLogger; + WifiLogger __wifiLogger; + std::vector __listeners; + std::shared_ptr __currentMacEvents; + Interval __currentInterval; + std::vector __locationEvents; + std::vector> __historyFrames; // python: history_scans + history_times + std::vector> __bufferedFrames; // python: buffered_scans + buffered_times + int __stableCounter; + int __tolerance; + bool __entranceToPlace; + int __periodSeconds; + DatabaseManager __dbManager; + + // fields that are used only in case of entrance detection + std::shared_ptr __representativesMacs; // macs that represent the current place + std::shared_ptr __stayMacs; // macs that can appear in the current place + time_t __entranceTime; + time_t __departureTime; + + bool __isValid(const Mac &mac); + void __shiftCurrentInterval(); + void __detectEntranceOrDeparture(std::shared_ptr frame); + void __detectEntrance(std::shared_ptr frame); + void __detectDeparture(std::shared_ptr frame); + void __processBuffer(std::shared_ptr frame); // python: buffer_analysing + std::shared_ptr __makeFrame(std::shared_ptr macEvents, Interval interval); // python: scans2fingerprint + void __resetHistory(); + void __resetHistory(std::shared_ptr frame); + void __visitStartDetected(); + void __visitEndDetected(); + void __putLocationToVisit(Visit &visit); + std::shared_ptr __selectRepresentatives(const std::vector> &frames); + std::shared_ptr __macSetOfGreaterOrEqualShare(const Macs2Shares &macs2Shares, share_t threshold); + std::shared_ptr __macSharesFromCounts(Macs2Counts const &macs2Counts, count_t denominator); // python: response_rate + share_t __calcMaxShare(const Macs2Shares &macs2Shares); + bool __isDisjoint(const Macs2Counts &macs2Counts, const MacSet &macSet); + bool __protrudesFrom(const Macs2Counts &macs2Counts, const MacSet &macSet); + void __setPeriod(PlaceRecogMode mode); + void __processCurrentLogger(); + + /* DATABASE */ + void __dbCreateTable(); + int __dbInsertVisit(Visit visit); + void __putVisitCategToJson(const char* key, const Categs &categs, int categType, Json &data); + void __putVisitCategsToJson(const Categs &categs, Json &data); + + /* INPUT */ + void onWifiScan(MacEvent event); + void onNewLocation(LocationEvent location); + + public: + VisitDetector(time_t startScan, PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE, bool testMode = false); + ~VisitDetector(); + + std::shared_ptr getVisits(); // only used in test mode + void setMode(PlaceRecogMode energyMode); + + }; /* class VisitDetector */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_VISIT_DETECTOR_H_ */ diff --git a/src/my-place/user_places/visit_listener_iface.h b/src/my-place/user_places/visit_listener_iface.h new file mode 100644 index 0000000..fefc926 --- /dev/null +++ b/src/my-place/user_places/visit_listener_iface.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_VISIT_LISTENER_IFACE_H_ +#define _CONTEXT_PLACE_RECOGNITION_VISIT_LISTENER_IFACE_H_ + +namespace ctx { + + class IVisitListener { + + public: + virtual ~IVisitListener() {}; + virtual void onVisitStart() = 0; + virtual void onVisitEnd() = 0; + + }; /* class IVisitListener */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_VISIT_LISTENER_IFACE_H_ */ diff --git a/src/my-place/user_places/wifi_listener_iface.h b/src/my-place/user_places/wifi_listener_iface.h new file mode 100644 index 0000000..3b883d3 --- /dev/null +++ b/src/my-place/user_places/wifi_listener_iface.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_WIFI_LISTENER_IFACE_H_ +#define _CONTEXT_PLACE_RECOGNITION_WIFI_LISTENER_IFACE_H_ + +#include "user_places_types.h" + +namespace ctx { + + class IWifiListener { + + public: + virtual ~IWifiListener() {}; + virtual void onWifiScan(ctx::MacEvent macEvent) = 0; + + }; /* IWifiListener */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_WIFI_LISTENER_IFACE_H_ */ diff --git a/src/my-place/user_places/wifi_logger.cpp b/src/my-place/user_places/wifi_logger.cpp new file mode 100644 index 0000000..3367276 --- /dev/null +++ b/src/my-place/user_places/wifi_logger.cpp @@ -0,0 +1,475 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "../place_recognition_types.h" +#include "debug_utils.h" +#include "wifi_logger.h" + +#define __WIFI_CREATE_TABLE_COLUMNS \ + WIFI_COLUMN_TIMESTAMP " timestamp NOT NULL, "\ + WIFI_COLUMN_BSSID " TEXT NOT NULL" + +#define __WIFI_ERROR_LOG(error) { \ + if (error != WIFI_ERROR_NONE) { \ + _E("ERROR == %s", __wifiError2Str(error)); \ + } else { \ + _D("SUCCESS"); \ + } \ +} + +int ctx::WifiLogger::__dbCreateTable() +{ + ctx::DatabaseManager dbManager; + bool ret = dbManager.createTable(0, WIFI_TABLE_NAME, __WIFI_CREATE_TABLE_COLUMNS, NULL, NULL); + _D("Table Creation Request: %s", ret ? "SUCCESS" : "FAIL"); + return ret; +} + +int ctx::WifiLogger::__dbInsertLogs() +{ + if (__logs.size() > 0) { + ctx::DatabaseManager dbManager; + std::stringstream query; + const char* separator = " "; + query << "BEGIN TRANSACTION; \ + INSERT INTO " WIFI_TABLE_NAME " \ + ( " WIFI_COLUMN_BSSID ", " WIFI_COLUMN_TIMESTAMP " ) \ + VALUES"; + for (MacEvent mac_event : __logs) { + query << separator << "( '" << mac_event.mac << "', '" << mac_event.timestamp << "' )"; + separator = ", "; + } + __logs.clear(); + query << "; \ + END TRANSACTION;"; + bool ret = dbManager.execute(0, query.str().c_str(), NULL); + _D("DB insert request: %s", ret ? "SUCCESS" : "FAIL"); + return ret; + } + _D("__logs vector empty -> nothing to insert"); + return 0; +} + +ctx::WifiLogger::WifiLogger(IWifiListener * listener, PlaceRecogMode energyMode, bool testMode) : + __timerOn(false), + __intervalMinutes(WIFI_LOGGER_INTERVAL_MINUTES_HIGH_ACCURACY), + __testMode(testMode), + __listener(listener), + __lastScanTime(time_t(0)), + __lasTimerCallbackTime(time_t(0)), + __duringVisit(false), + __connectedToWifiAp(false), + __started(false), + __running(false) +{ + _D("CONSTRUCTOR"); + if (testMode) { + return; + } + __setInterval(energyMode); + + if (WIFI_LOGGER_DATABASE) { + __dbCreateTable(); + } + + __logs = std::vector(); + + __wifiInitializeRequest(); + __wifiSetDeviceStateChangedCbRequest(); + if (WIFI_LOGGER_LOW_POWER_MODE) { + __wifiSetConnectionStateChangedCbRequest(); + } + wifi_connection_state_e state = __wifiGetConnectionStateRequest(); + __connectedToWifiAp = (state == WIFI_CONNECTION_STATE_CONNECTED); + _D("__connectedToWifiAp = %d, __duringVisit = %d IN CONSTRUCTOR", + static_cast(__connectedToWifiAp), + static_cast(__duringVisit)); +} + +ctx::WifiLogger::~WifiLogger() +{ + _D("DESTRUCTOR"); + stopLogging(); + __wifiDeinitializeRequest(); +} + +void ctx::WifiLogger::__wifiDeviceStateChangedCb(wifi_device_state_e state, void *userData) +{ + ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; + switch (state) { + case WIFI_DEVICE_STATE_DEACTIVATED: + _D("WIFI setting OFF"); + if (wifiLogger->__started) { + wifiLogger->__stopLogging(); + } + break; + case WIFI_DEVICE_STATE_ACTIVATED: + _D("WIFI setting ON"); + if (wifiLogger->__started) { + wifiLogger->__startLogging(); + } + break; + default: + break; + } +} + +void ctx::WifiLogger::__wifiConnectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData) +{ + ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; + switch (state) { + case WIFI_CONNECTION_STATE_CONNECTED: + _D("connected to AP"); + wifiLogger->__connectedToWifiAp = true; + break; + default: + _D("disconnected from AP -> __lastScansPool.clear()"); + wifiLogger->__connectedToWifiAp = false; + wifiLogger->__lastScansPool.clear(); + break; + } + // TODO: Check if AP bssid (MAC Address) will be helpful somehow in LOW_POWER mode +} + +bool ctx::WifiLogger::__wifiFoundApCb(wifi_ap_h ap, void *userData) +{ + ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; + + char *bssid = NULL; + int ret = __wifiApGetBssidRequest(ap, &bssid); + if (ret != WIFI_ERROR_NONE) { + return false; + } + + Mac mac; + try { + mac = Mac(bssid); + } catch (std::runtime_error &e) { + _E("Cannot create mac_event. Exception: %s", e.what()); + return false; + } + + MacEvent log(wifiLogger->__lastScanTime, mac); + if (wifiLogger->__listener) { + wifiLogger->__listener->onWifiScan(log); + if (WIFI_LOGGER_LOW_POWER_MODE + && (wifiLogger->__connectedToWifiAp || wifiLogger->__duringVisit) ) { + // Add to last scans AP's set + wifiLogger->__lastScansPool.insert(std::string(bssid)); + } + } + if (WIFI_LOGGER_DATABASE) { + wifiLogger->__logs.push_back(log); + } + + return true; +} + +const char* ctx::WifiLogger::__wifiError2Str(int error) +{ + switch (error) { + case WIFI_ERROR_INVALID_PARAMETER: + return "WIFI_ERROR_INVALID_PARAMETER"; + case WIFI_ERROR_OUT_OF_MEMORY: + return "WIFI_ERROR_OUT_OF_MEMORY"; + case WIFI_ERROR_INVALID_OPERATION: + return "WIFI_ERROR_INVALID_OPERATION"; + case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + return "WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED"; + case WIFI_ERROR_OPERATION_FAILED: + return "WIFI_ERROR_OPERATION_FAILED"; + case WIFI_ERROR_NO_CONNECTION: + return "WIFI_ERROR_NO_CONNECTION"; + case WIFI_ERROR_NOW_IN_PROGRESS: + return "WIFI_ERROR_NOW_IN_PROGRESS"; + case WIFI_ERROR_ALREADY_EXISTS: + return "WIFI_ERROR_ALREADY_EXISTS"; + case WIFI_ERROR_OPERATION_ABORTED: + return "WIFI_ERROR_OPERATION_ABORTED"; + case WIFI_ERROR_DHCP_FAILED: + return "WIFI_ERROR_DHCP_FAILED"; + case WIFI_ERROR_INVALID_KEY: + return "WIFI_ERROR_INVALID_KEY"; + case WIFI_ERROR_NO_REPLY: + return "WIFI_ERROR_NO_REPLY"; + case WIFI_ERROR_SECURITY_RESTRICTED: + return "WIFI_ERROR_SECURITY_RESTRICTED"; + case WIFI_ERROR_PERMISSION_DENIED: + return "WIFI_ERROR_PERMISSION_DENIED"; + default: + return "unknown wifi error code"; + } +} + +void ctx::WifiLogger::__wifiScanFinishedCb(wifi_error_e errorCode, void *userData) +{ + ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; + + time_t now = time(nullptr); +#ifdef TIZEN_ENGINEER_MODE + double seconds = 0; + if (wifiLogger->__lastScanTime > 0) { + seconds = difftime(now, wifiLogger->__lastScanTime); + } + std::string timeStr = DebugUtils::humanReadableDateTime(now, "%T", 9); + _D("__connectedToWifiAp = %d, __duringVisit = %d, __lastScansPool.size() = %d -> scan %s (from last : %.1fs)", + static_cast(wifiLogger->__connectedToWifiAp), + static_cast(wifiLogger->__duringVisit), + wifiLogger->__lastScansPool.size(), + timeStr.c_str(), + seconds); +#endif /* TIZEN_ENGINEER_MODE */ + wifiLogger->__lastScanTime = now; + + int ret = __wifiForeachFoundApsRequest(userData); + if (ret != WIFI_ERROR_NONE) { + return; + } + if (WIFI_LOGGER_DATABASE) { + wifiLogger->__dbInsertLogs(); + } +} + +bool ctx::WifiLogger::__checkWifiIsActivated() +{ + bool wifiActivated = true; + int ret = wifi_is_activated(&wifiActivated); + __WIFI_ERROR_LOG(ret); + _D("Wi-Fi is %s", wifiActivated ? "ON" : "OFF"); + return wifiActivated; +} + +void ctx::WifiLogger::__wifiScanRequest() +{ + int ret = wifi_scan(__wifiScanFinishedCb, this); + __WIFI_ERROR_LOG(ret); +} + +int ctx::WifiLogger::__wifiForeachFoundApsRequest(void *userData) +{ + int ret = wifi_foreach_found_aps(__wifiFoundApCb, userData); + __WIFI_ERROR_LOG(ret); + return ret; +} + +wifi_connection_state_e ctx::WifiLogger::__wifiGetConnectionStateRequest() +{ + wifi_connection_state_e connectionState; + int ret = wifi_get_connection_state(&connectionState); + __WIFI_ERROR_LOG(ret); + return connectionState; +} + +void ctx::WifiLogger::__wifiSetBackgroundScanCbRequest() +{ + int ret = wifi_set_background_scan_cb(__wifiScanFinishedCb, this); + __WIFI_ERROR_LOG(ret); +} + +void ctx::WifiLogger::__wifiSetDeviceStateChangedCbRequest() +{ + int ret = wifi_set_device_state_changed_cb(__wifiDeviceStateChangedCb, this); + __WIFI_ERROR_LOG(ret); +} + +void ctx::WifiLogger::__wifiSetConnectionStateChangedCbRequest() +{ + int ret = wifi_set_connection_state_changed_cb(__wifiConnectionStateChangedCb, this); + __WIFI_ERROR_LOG(ret); +} + +int ctx::WifiLogger::__wifiApGetBssidRequest(wifi_ap_h ap, char **bssid) +{ + int ret = wifi_ap_get_bssid(ap, bssid); + __WIFI_ERROR_LOG(ret); + return ret; +} + +void ctx::WifiLogger::__wifiInitializeRequest() +{ + int ret = wifi_initialize(); + __WIFI_ERROR_LOG(ret); +} + +void ctx::WifiLogger::__wifiDeinitializeRequest() +{ + int ret = wifi_deinitialize(); + __WIFI_ERROR_LOG(ret); +} + +bool ctx::WifiLogger::__checkTimerId(int id) +{ + _D("id == %d, __timerId == %d", id, __timerId); + return id == __timerId; +} + +/* + * Accepted time from last callback is >= than minimum interval + */ +bool ctx::WifiLogger::__checkTimerTime(time_t now) +{ + double seconds = 0; + if (__lasTimerCallbackTime > 0) { + seconds = difftime(now, __lasTimerCallbackTime); + if (seconds < WIFI_LOGGER_ACTIVE_SCANNING_MIN_INTERVAL) { + _D("last == %d, now == %d, diff = %.1fs -> Incorrect timer callback", __lasTimerCallbackTime, now, seconds); + return false; + } else { + _D("last == %d, now == %d, diff = %.1fs -> Correct timer callback", __lasTimerCallbackTime, now, seconds); + } + } else { + _D("last == %d, now == %d -> First callback", __lasTimerCallbackTime, now); + } + __lasTimerCallbackTime = now; + return true; +} + +bool ctx::WifiLogger::onTimerExpired(int id) +{ + time_t now = time(nullptr); + _D(""); + if (__checkTimerId(id) == false) { + // Incorrect callback call + return false; + } + if (__checkTimerTime(now) == false) { + // Prevention from double callback call bug + return __timerOn; + } + _D("__connectedToWifiAp = %d, __duringVisit = %d, __lastScansPool.size() = %d", + static_cast(__connectedToWifiAp), + static_cast(__duringVisit), + __lastScansPool.size()); + if (WIFI_LOGGER_LOW_POWER_MODE + && __duringVisit + && __connectedToWifiAp + && __lastScansPool.size() > 0) { + _D("trying to send fake scan"); + if (__listener) { + _D("__listener != false -> CORRECT"); + for (std::string bssid : __lastScansPool) { + Mac mac(bssid); + MacEvent scan(now, mac); + _D("send fake scan (%s)", bssid.c_str()); + __listener->onWifiScan(scan); + } + } + } else { + __wifiScanRequest(); + } + return __timerOn; +} + +void ctx::WifiLogger::startLogging() +{ + _D(""); + __started = true; + __startLogging(); +} + +void ctx::WifiLogger::__startLogging() +{ + _D(""); + if (!__checkWifiIsActivated() || __running) { + return; + } + __running = true; + + if (WIFI_LOGGER_ACTIVE_SCANNING) { + __timerStart(__intervalMinutes); + __wifiScanRequest(); + } + if (WIFI_LOGGER_PASSIVE_SCANNING) { + __wifiSetBackgroundScanCbRequest(); + } +} + +void ctx::WifiLogger::stopLogging() +{ + _D(""); + __started = false; + __stopLogging(); +} + +void ctx::WifiLogger::__stopLogging() +{ + _D(""); + if (!__running) { + return; + } + if (WIFI_LOGGER_ACTIVE_SCANNING) { + // Unset timer + __timerOn = false; + // Remove timer + __timerManager.remove(__timerId); + } + if (WIFI_LOGGER_PASSIVE_SCANNING) { + wifi_unset_background_scan_cb(); + } + __running = false; +} + +void ctx::WifiLogger::__timerStart(time_t minutes) +{ + __timerOn = true; + __timerId = __timerManager.setFor(minutes, this); + _D("%s (minutes=%d)", __timerId >= 0 ? "SUCCESS" : "ERROR", minutes); +} + +void ctx::WifiLogger::onVisitStart() +{ + _D(""); + __duringVisit = true; +} + +void ctx::WifiLogger::onVisitEnd() +{ + _D("__lastScansPool.clear()"); + __duringVisit = false; + __lastScansPool.clear(); +} + +void ctx::WifiLogger::__setInterval(PlaceRecogMode energyMode) +{ + switch (energyMode) { + case PLACE_RECOG_LOW_POWER_MODE: + __intervalMinutes = WIFI_LOGGER_INTERVAL_MINUTES_LOW_POWER; + break; + case PLACE_RECOG_HIGH_ACCURACY_MODE: + __intervalMinutes = WIFI_LOGGER_INTERVAL_MINUTES_HIGH_ACCURACY; + break; + default: + _E("Incorrect energy mode"); + } +} + +void ctx::WifiLogger::__timerRestart() +{ + __timerManager.remove(__timerId); + __timerStart(__intervalMinutes); +} + +void ctx::WifiLogger::setMode(PlaceRecogMode energyMode) +{ + _D(""); + __setInterval(energyMode); + if (WIFI_LOGGER_ACTIVE_SCANNING && __timerOn) { + __timerRestart(); + } +} diff --git a/src/my-place/user_places/wifi_logger.h b/src/my-place/user_places/wifi_logger.h new file mode 100644 index 0000000..9938a2c --- /dev/null +++ b/src/my-place/user_places/wifi_logger.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_WIFI_LOGGER_H_ +#define _CONTEXT_PLACE_RECOGNITION_WIFI_LOGGER_H_ + +#include +#include +#include +#include +#include +#include "wifi_listener_iface.h" +#include "visit_listener_iface.h" +#include "user_places_params.h" + +/* Database usage flag */ +#define WIFI_LOGGER_DATABASE false + +/* Active scanning usage flag */ +#define WIFI_LOGGER_ACTIVE_SCANNING true + +/* Passive scanning usage flag */ +#define WIFI_LOGGER_PASSIVE_SCANNING true + +/* Active scanning minimum interval in seconds */ +#define WIFI_LOGGER_ACTIVE_SCANNING_MIN_INTERVAL 10 + +/* + * Low power scanning usage flag + * (When phone is connected to some WiFi Access Point + * last scan data is returned instead of new scan triggering) + */ +#define WIFI_LOGGER_LOW_POWER_MODE false + +namespace ctx { + + class WifiLogger : public ITimerListener, public IVisitListener { + + public: + WifiLogger(IWifiListener * listener = nullptr, + PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE, + bool testMode = false); + ~WifiLogger(); + + void startLogging(); + void stopLogging(); + void setMode(PlaceRecogMode energyMode); + + private: + /* INPUT */ + void onVisitStart(); + void onVisitEnd(); + + bool onTimerExpired(int timerId); + + /* TIMER */ + bool __timerOn; + int __timerId; + int __intervalMinutes; + TimerManager __timerManager; + void __setInterval(PlaceRecogMode energyMode); + bool __checkTimerId(int id); + bool __checkTimerTime(time_t now); + void __timerStart(time_t minutes); + void __timerRestart(); + + /* DATABASE */ + static int __dbCreateTable(); + int __dbInsertLogs(); + + /* SYSTEM CAPI WRAPPERS */ + void __wifiSetBackgroundScanCbRequest(); + void __wifiSetDeviceStateChangedCbRequest(); + void __wifiSetConnectionStateChangedCbRequest(); + static bool __checkWifiIsActivated(); + void __wifiScanRequest(); + static int __wifiForeachFoundApsRequest(void *userData); + static wifi_connection_state_e __wifiGetConnectionStateRequest(); + static int __wifiApGetBssidRequest(wifi_ap_h ap, char **bssid); + void __wifiInitializeRequest(); + void __wifiDeinitializeRequest(); + + /* SYSTEM CAPI CALLBACKS */ + static void __wifiDeviceStateChangedCb(wifi_device_state_e state, void *userData); + static void __wifiConnectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData); + static bool __wifiFoundApCb(wifi_ap_h ap, void *userData); + static void __wifiScanFinishedCb(wifi_error_e errorCode, void *userData); + + bool __testMode; + IWifiListener * const __listener; + std::vector __logs; + std::set __lastScansPool; + time_t __lastScanTime; + time_t __lasTimerCallbackTime; + bool __duringVisit; + bool __connectedToWifiAp; + bool __started; + bool __running; + + void __startLogging(); + void __stopLogging(); + static const char* __wifiError2Str(int error); + + }; /* class WifiLogger */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_PLACE_RECOGNITION_WIFI_LOGGER_H_ */ diff --git a/src/place/CMakeLists.txt b/src/place/CMakeLists.txt deleted file mode 100644 index 1db79f7..0000000 --- a/src/place/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -# prvd_cdef, prvd_deps, and prvd_srcs need to be set properly - -# Build flag for the place auto detection engine. -# Set this to "yes" to enable the engine. -SET(enable_recog_engine "no") - -# Common Profile -FILE(GLOB prvd_srcs *.cpp) - -# Mobile Profile -IF("${PROFILE}" STREQUAL "mobile") - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} geofence/*.cpp) - SET(prvd_deps ${prvd_deps} capi-geofence-manager) - IF("${enable_recog_engine}" STREQUAL "yes") - FILE(GLOB_RECURSE prvd_srcs ${prvd_srcs} recognition/*.cpp) - SET(prvd_deps ${prvd_deps} capi-location-manager) - SET(prvd_deps ${prvd_deps} capi-network-wifi) - ELSE("${enable_recog_engine}" STREQUAL "yes") - SET(prvd_cdef ${prvd_cdef} _DISABLE_RECOG_ENGINE_) - ENDIF("${enable_recog_engine}" STREQUAL "yes") -ENDIF("${PROFILE}" STREQUAL "mobile") diff --git a/src/place/PlaceContextProvider.cpp b/src/place/PlaceContextProvider.cpp deleted file mode 100644 index 349000a..0000000 --- a/src/place/PlaceContextProvider.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include - -#ifdef _MOBILE_ -#include "geofence/PlaceGeofenceProvider.h" -#ifndef _DISABLE_RECOG_ENGINE_ -#include "recognition/place_recognition.h" -#endif /* _DISABLE_RECOG_ENGINE_ */ -#endif /* _MOBILE_ */ - -template -void registerProvider(const char *subject, const char *privilege) -{ - Provider *provider = new(std::nothrow) Provider(); - IF_FAIL_VOID_TAG(provider, _E, "Memory allocation failed"); - - if (!provider->isSupported()) { - delete provider; - return; - } - - provider->registerProvider(privilege, provider); - provider->submitTriggerItem(); -} - -SO_EXPORT bool ctx::initPlaceContextProvider() -{ -#ifdef _MOBILE_ - registerProvider(PLACE_SUBJ_GEOFENCE, PLACE_PRIV_GEOFENCE); - -#ifndef _DISABLE_RECOG_ENGINE_ - registerProvider(PLACE_SUBJ_RECOGNITION, PLACE_PRIV_RECOGNITION); -#endif /* _DISABLE_RECOG_ENGINE_ */ - -#endif /* _MOBILE_ */ - return true; -} diff --git a/src/place/geofence/GeofenceMonitorHandle.cpp b/src/place/geofence/GeofenceMonitorHandle.cpp deleted file mode 100644 index 868966a..0000000 --- a/src/place/geofence/GeofenceMonitorHandle.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "PlaceGeofenceProvider.h" -#include "GeofenceMonitorHandle.h" - -using namespace ctx; - -GeofenceMonitorHandle::GeofenceMonitorHandle(PlaceGeofenceProvider *provider) : - __provider(provider), - __placeId(-1), - __prevState(GEOFENCE_STATE_UNCERTAIN), - __geoHandle(NULL) -{ -} - -GeofenceMonitorHandle::~GeofenceMonitorHandle() -{ - __stopMonitor(); -} - -bool GeofenceMonitorHandle::startMonitor(int placeId) -{ - _D("Starts to monitor Place-%d", placeId); - - IF_FAIL_RETURN(placeId >= 0, false); - IF_FAIL_RETURN_TAG(__geoHandle == NULL, false, _E, "Re-starting MyPlace monitor"); - - geofence_manager_create(&__geoHandle); - IF_FAIL_RETURN_TAG(__geoHandle, false, _E, "Geofence initialization failed"); - - int ret; - - ret = geofence_manager_set_geofence_state_changed_cb(__geoHandle, __fenceStateCb, this); - IF_FAIL_CATCH_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, _E, "Setting state callback failed"); - - ret = geofence_manager_set_geofence_event_cb(__geoHandle, __fenceEventCb, this); - IF_FAIL_CATCH_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, _E, "Setting event callback failed"); - - ret = geofence_manager_foreach_place_geofence_list(__geoHandle, placeId, __fenceListCb, this); - IF_FAIL_CATCH_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, _E, "Getting fence list failed"); - - __placeId = placeId; - return true; - -CATCH: - __stopMonitor(); - return false; -} - -int GeofenceMonitorHandle::getPlaceId() -{ - return __placeId; -} - -void GeofenceMonitorHandle::__stopMonitor() -{ - _D("Stops monitoring Place-%d", __placeId); - - //TODO: Do we need to stop all geofences explicitly? - if (__geoHandle) { - geofence_manager_destroy(__geoHandle); - __geoHandle = NULL; - } - - __geoStateMap.clear(); - __placeId = -1; - __prevState = GEOFENCE_STATE_UNCERTAIN; -} - -bool GeofenceMonitorHandle::__startFence(int fenceId) -{ - int ret; - - ret = geofence_manager_start(__geoHandle, fenceId); - IF_FAIL_RETURN_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, true, _W, "Starting failed"); - - geofence_status_h status; - ret = geofence_status_create(fenceId, &status); - IF_FAIL_RETURN_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, true, _W, "Getting status failed"); - - geofence_state_e state = GEOFENCE_STATE_UNCERTAIN; - geofence_status_get_state(status, &state); - geofence_status_destroy(status); - - __geoStateMap[fenceId] = state; - - return true; -} - -void GeofenceMonitorHandle::__removeFence(int fenceId) -{ - geofence_manager_stop(__geoHandle, fenceId); - __geoStateMap.erase(fenceId); -} - -void GeofenceMonitorHandle::__updateFence(int fenceId, geofence_manage_e manage) -{ - switch (manage) { - case GEOFENCE_MANAGE_PLACE_REMOVED: - _W("[Place-%d] Removed", __placeId); - __stopMonitor(); - break; - case GEOFENCE_MANAGE_FENCE_ADDED: - _I("[Place %d] Fence-%d added", __placeId, fenceId); - __startFence(fenceId); - __emitStateChange(); - break; - case GEOFENCE_MANAGE_FENCE_REMOVED: - _I("[Place-%d] Fence-%d removed", __placeId, fenceId); - __removeFence(fenceId); - __emitStateChange(); - break; - case GEOFENCE_MANAGE_FENCE_STARTED: - _D("[Place-%d] Fence-%d started", __placeId, fenceId); - break; - case GEOFENCE_MANAGE_FENCE_STOPPED: - _D("[Place-%d] Fence-%d stopped", __placeId, fenceId); - //TODO: Do we need to restart this? - break; - default: - _D("[Place-%d] Ignoring the manage event %d", __placeId, manage); - break; - } -} - -void GeofenceMonitorHandle::__updateState(int fenceId, geofence_state_e state) -{ - __geoStateMap[fenceId] = state; -} - -void GeofenceMonitorHandle::__emitStateChange() -{ - geofence_state_e currentState = GEOFENCE_STATE_UNCERTAIN; - int outCount = 0; - - for (auto it = __geoStateMap.begin(); it != __geoStateMap.end(); ++it) { - if (it->second == GEOFENCE_STATE_IN) { - currentState = GEOFENCE_STATE_IN; - break; - } else if (it->second == GEOFENCE_STATE_OUT) { - ++outCount; - } - } - - if (currentState != GEOFENCE_STATE_IN && outCount > 0) { - currentState = GEOFENCE_STATE_OUT; - } - - if (currentState == __prevState) { - return; - } - - __prevState = currentState; - - Json option; - option.set(NULL, PLACE_GEOFENCE_PLACE_ID, __placeId); - - Json data; - data.set(NULL, PLACE_GEOFENCE_PLACE_ID, __placeId); - data.set(NULL, PLACE_GEOFENCE_EVENT, __getStateString(currentState)); - - __provider->publish(option, ERR_NONE, data); -} - -const char* GeofenceMonitorHandle::__getStateString(geofence_state_e state) -{ - switch (state) { - case GEOFENCE_STATE_IN: - return PLACE_GEOFENCE_IN; - case GEOFENCE_STATE_OUT: - return PLACE_GEOFENCE_OUT; - case GEOFENCE_STATE_UNCERTAIN: - return PLACE_GEOFENCE_UNCERTAIN; - default: - return PLACE_GEOFENCE_UNCERTAIN; - } -} - -bool GeofenceMonitorHandle::__fenceListCb(int geofenceId, geofence_h fence, int fenceIndex, int fenceCount, void* userData) -{ - _D("FenceID: %d, Index: %d, Count: %d", geofenceId, fenceIndex, fenceCount); - IF_FAIL_RETURN(fenceCount > 0, false); - - GeofenceMonitorHandle *handle = reinterpret_cast(userData); - return handle->__startFence(geofenceId); -} - -void GeofenceMonitorHandle::__fenceEventCb(int placeId, int geofenceId, geofence_manager_error_e error, geofence_manage_e manage, void* userData) -{ - IF_FAIL_VOID_TAG(error == GEOFENCE_MANAGER_ERROR_NONE, _W, "Geofence error: %d", error); - - GeofenceMonitorHandle *handle = reinterpret_cast(userData); - - IF_FAIL_VOID_TAG(placeId == handle->getPlaceId(), _W, "Mismatched Place ID"); - - handle->__updateFence(geofenceId, manage); -} - -void GeofenceMonitorHandle::__fenceStateCb(int geofenceId, geofence_state_e state, void* userData) -{ - GeofenceMonitorHandle *handle = reinterpret_cast(userData); - handle->__updateState(geofenceId, state); - handle->__emitStateChange(); -} diff --git a/src/place/geofence/GeofenceMonitorHandle.h b/src/place/geofence/GeofenceMonitorHandle.h deleted file mode 100644 index 6bdd301..0000000 --- a/src/place/geofence/GeofenceMonitorHandle.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_GEOFENCE_MONITOR_HANDLE_H_ -#define _CONTEXT_PLACE_GEOFENCE_MONITOR_HANDLE_H_ - -#include -#include -#include - -namespace ctx { - - class PlaceGeofenceProvider; - - class GeofenceMonitorHandle { - public: - GeofenceMonitorHandle(PlaceGeofenceProvider *provider); - ~GeofenceMonitorHandle(); - - bool startMonitor(int placeId); - int getPlaceId(); - - private: - PlaceGeofenceProvider *__provider; - int __placeId; - geofence_state_e __prevState; - geofence_manager_h __geoHandle; - std::map __geoStateMap; - - void __emitStateChange(); - void __stopMonitor(); - bool __startFence(int fenceId); - void __removeFence(int fenceId); - void __updateFence(int fenceId, geofence_manage_e manage); - void __updateState(int fenceId, geofence_state_e state); - - static const char* __getStateString(geofence_state_e state); - - static bool __fenceListCb(int geofenceId, geofence_h fence, int fenceIndex, int fenceCount, void* userData); - static void __fenceEventCb(int placeId, int geofenceId, geofence_manager_error_e error, geofence_manage_e manage, void* userData); - static void __fenceStateCb(int geofenceId, geofence_state_e state, void* userData); - }; - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_GEOFENCE_MONITOR_HANDLE_H_ */ diff --git a/src/place/geofence/PlaceGeofenceProvider.cpp b/src/place/geofence/PlaceGeofenceProvider.cpp deleted file mode 100644 index e7aff50..0000000 --- a/src/place/geofence/PlaceGeofenceProvider.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "GeofenceMonitorHandle.h" -#include "PlaceGeofenceProvider.h" - -using namespace ctx; - -PlaceGeofenceProvider::PlaceGeofenceProvider() : - ContextProvider(PLACE_SUBJ_GEOFENCE) -{ -} - -PlaceGeofenceProvider::~PlaceGeofenceProvider() -{ - for (auto& it : __handleMap) { - delete it.second; - } - - __handleMap.clear(); -} - -bool PlaceGeofenceProvider::isSupported() -{ - bool supported = false; - int ret = geofence_manager_is_supported(&supported); - IF_FAIL_RETURN_TAG(ret == GEOFENCE_MANAGER_ERROR_NONE, false, _E, "geofence_manager_is_supported() failed"); - return supported; -} - -void PlaceGeofenceProvider::submitTriggerItem() -{ - registerTriggerItem(OPS_SUBSCRIBE, - "{" - "\"Event\":{\"type\":\"string\",\"values\":[\"In\",\"Out\"]}" - "}", - "{" - "\"PlaceId\":{\"type\":\"integer\",\"min\":1}" - "}"); -} - -int PlaceGeofenceProvider::subscribe(Json option, Json *requestResult) -{ - int placeId = -1; - option.get(NULL, PLACE_GEOFENCE_PLACE_ID, &placeId); - IF_FAIL_RETURN_TAG(placeId != -1, ERR_INVALID_PARAMETER, _E, "Getting PlaceID failed"); - - auto it = __handleMap.find(placeId); - if (it != __handleMap.end()) { - _D("Place ID %d is being monitored already", placeId); - return ERR_NONE; - } - - GeofenceMonitorHandle *handle = new(std::nothrow) GeofenceMonitorHandle(this); - ASSERT_ALLOC(handle); - - bool ret = handle->startMonitor(placeId); - if (!ret) { - _E("Monitoring Place ID %d failed", placeId); - delete handle; - return ERR_OPERATION_FAILED; - } - - __handleMap[placeId] = handle; - - return ERR_NONE; -} - -int PlaceGeofenceProvider::unsubscribe(Json option) -{ - int placeId = -1; - option.get(NULL, PLACE_GEOFENCE_PLACE_ID, &placeId); - IF_FAIL_RETURN_TAG(placeId != -1, ERR_INVALID_PARAMETER, _E, "Getting PlaceID failed"); - - auto it = __handleMap.find(placeId); - if (it == __handleMap.end()) { - _D("Place ID %d is not being monitored", placeId); - return ERR_NONE; - } - - delete it->second; - __handleMap.erase(it); - - return ERR_NONE; -} diff --git a/src/place/geofence/PlaceGeofenceProvider.h b/src/place/geofence/PlaceGeofenceProvider.h deleted file mode 100644 index e6ebf2f..0000000 --- a/src/place/geofence/PlaceGeofenceProvider.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_GEOFENCE_PROVIDER_H_ -#define _CONTEXT_PLACE_GEOFENCE_PROVIDER_H_ - -#include -#include -#include "PlaceGeofenceTypes.h" - -namespace ctx { - - class GeofenceMonitorHandle; - - class PlaceGeofenceProvider : public ContextProvider { - public: - PlaceGeofenceProvider(); - ~PlaceGeofenceProvider(); - - int subscribe(Json option, Json *requestResult); - int unsubscribe(Json option); - - bool isSupported(); - void submitTriggerItem(); - - private: - std::map __handleMap; - }; - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_GEOFENCE_PROVIDER_H_ */ diff --git a/src/place/geofence/PlaceGeofenceTypes.h b/src/place/geofence/PlaceGeofenceTypes.h deleted file mode 100644 index fa66a41..0000000 --- a/src/place/geofence/PlaceGeofenceTypes.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_GEOFENCE_TYPES_H_ -#define _CONTEXT_PLACE_GEOFENCE_TYPES_H_ - -// Subject -#define PLACE_SUBJ_GEOFENCE "place/geofence" - -// Privilege -#define PLACE_PRIV_GEOFENCE "location" - -// Option & Data Key -#define PLACE_GEOFENCE_PLACE_ID "PlaceId" -#define PLACE_GEOFENCE_EVENT "Event" - -// Data Value -#define PLACE_GEOFENCE_UNCERTAIN "Uncertain" -#define PLACE_GEOFENCE_IN "In" -#define PLACE_GEOFENCE_OUT "Out" - -#endif /* End of _CONTEXT_PLACE_GEOFENCE_TYPES_H_ */ diff --git a/src/place/recognition/place_recognition.cpp b/src/place/recognition/place_recognition.cpp deleted file mode 100644 index b736f1a..0000000 --- a/src/place/recognition/place_recognition.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "place_recognition.h" -#include "user_places/user_places.h" - -int ctx::PlaceRecognitionProvider::subscribe(ctx::Json option, ctx::Json* requestResult) -{ - return ERR_NOT_SUPPORTED; -} - -int ctx::PlaceRecognitionProvider::unsubscribe(ctx::Json option) -{ - return ERR_NOT_SUPPORTED; -} - -int ctx::PlaceRecognitionProvider::read(ctx::Json option, ctx::Json* requestResult) -{ - _I(BLUE("Read")); - _J("Option", option); - - std::vector> places = __engine.getPlaces(); - Json dataRead = UserPlaces::composeJson(places); - - /* - * The below function needs to be called once. - * It does not need to be called within this read() function. - * In can be called later, in another scope. - * Please just be sure that, the 2nd input parameter "option" should be the same to the - * "option" parameter received via ctx::PlaceRecognitionProvider::read(). - */ - replyToRead(option, ERR_NONE, dataRead); - - return ERR_NONE; -} - -int ctx::PlaceRecognitionProvider::write(ctx::Json data, ctx::Json* requestResult) -{ - return ERR_NOT_SUPPORTED; -} - -bool ctx::PlaceRecognitionProvider::isSupported() -{ - /* TODO: This function should be implemented properly */ - return true; -} diff --git a/src/place/recognition/place_recognition.h b/src/place/recognition/place_recognition.h deleted file mode 100644 index 814bb00..0000000 --- a/src/place/recognition/place_recognition.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_H_ -#define _CONTEXT_PLACE_RECOGNITION_H_ - -#include -#include "place_recognition_types.h" -#include "user_places/user_places.h" - -namespace ctx { - - class PlaceRecognitionProvider : public ContextProvider { - public: - PlaceRecognitionProvider() : - ContextProvider(PLACE_SUBJ_RECOGNITION), - __engine(PLACE_RECOG_HIGH_ACCURACY_MODE) {} - - ~PlaceRecognitionProvider() {} - - int subscribe(ctx::Json option, ctx::Json *requestResult); - int unsubscribe(ctx::Json option); - int read(ctx::Json option, ctx::Json *requestResult); - int write(ctx::Json data, ctx::Json *requestResult); - - bool isSupported(); - void submitTriggerItem() {} - - private: - UserPlaces __engine; - }; /* class PlaceRecognitionProvider */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_H_ */ diff --git a/src/place/recognition/place_recognition_types.h b/src/place/recognition/place_recognition_types.h deleted file mode 100644 index 9576331..0000000 --- a/src/place/recognition/place_recognition_types.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_TYPES_ -#define _CONTEXT_PLACE_RECOGNITION_TYPES_ - -// Context Items -#define PLACE_SUBJ_RECOGNITION "place/pattern/personal_poi" - -#define PLACE_PRIV_RECOGNITION "location" - -// Database -#define VISIT_TABLE "place_status_user_place_visit" -#define VISIT_COLUMN_START_TIME "start_time" -#define VISIT_COLUMN_END_TIME "end_time" -#define VISIT_COLUMN_WIFI_APS "wifi_aps" -#define VISIT_COLUMN_CATEGORY "category" -#ifdef TIZEN_ENGINEER_MODE -#define VISIT_COLUMN_START_TIME_HUMAN "start_time_human" // only for debug: human readable time data: -#define VISIT_COLUMN_END_TIME_HUMAN "end_time_human" // only for debug: human readable time data: -#endif /* TIZEN_ENGINEER_MODE */ -#define VISIT_COLUMN_LOCATION_VALID "geo_valid" -#define VISIT_COLUMN_LOCATION_LATITUDE "geo_latitude" -#define VISIT_COLUMN_LOCATION_LONGITUDE "geo_longitude" -#define VISIT_COLUMN_CATEG_HOME "categ_home" -#define VISIT_COLUMN_CATEG_WORK "categ_work" -#define VISIT_COLUMN_CATEG_OTHER "categ_other" - -#define PLACE_TABLE "place_status_user_place" -#define PLACE_COLUMN_CATEG_ID "type_id" // Name inconsistency: "cated_id" vs "type_id" TODO make it consistent -#define PLACE_COLUMN_CATEG_CONFIDENCE "type_confidence" -#define PLACE_COLUMN_NAME "name" -#define PLACE_COLUMN_LOCATION_VALID "geo_valid" -#define PLACE_COLUMN_LOCATION_LATITUDE "geo_latitude" -#define PLACE_COLUMN_LOCATION_LONGITUDE "geo_longitude" -#define PLACE_COLUMN_WIFI_APS "wifi_aps" -#define PLACE_COLUMN_CREATE_DATE "create_date" - -#define WIFI_TABLE_NAME "place_status_user_place_wifi" -#define WIFI_COLUMN_TIMESTAMP "timestamp" -#define WIFI_COLUMN_BSSID "bssid" - -#define LOCATION_TABLE_NAME "place_status_user_place_location" -#define LOCATION_COLUMN_LATITUDE "geo_latitude" -#define LOCATION_COLUMN_LONGITUDE "geo_longitude" -#define LOCATION_COLUMN_ACCURACY "accuracy" -#define LOCATION_COLUMN_TIMESTAMP "timestamp" -#ifdef TIZEN_ENGINEER_MODE -#define LOCATION_COLUMN_TIMESTAMP_HUMAN "time_human" // only for debug: human readable time data: -#define LOCATION_COLUMN_METHOD "method" -#endif /* TIZEN_ENGINEER_MODE */ - -// Data Key -#define DATA_READ "PlacesList" -#define PLACE_CATEG_ID "TypeId" // Name inconsistency: "cated_id" vs "type_id" TODO make it consistent -#define PLACE_CATEG_CONFIDENCE "TypeConfidence" -#define PLACE_NAME "Name" -#define PLACE_GEO_LATITUDE "GeoLatitude" -#define PLACE_GEO_LONGITUDE "GeoLongitude" -#define PLACE_WIFI_APS "WifiAPs" -#define PLACE_CREATE_DATE "CreateDate" - -// Data values -enum PlaceCategId { - PLACE_CATEG_ID_NONE = 0, - PLACE_CATEG_ID_HOME = 1, - PLACE_CATEG_ID_WORK = 2, - PLACE_CATEG_ID_OTHER = 3 -}; - -enum PlaceRecogMode { - PLACE_RECOG_HIGH_ACCURACY_MODE = 0, - PLACE_RECOG_LOW_POWER_MODE = 1 -}; - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_TYPES_ */ diff --git a/src/place/recognition/user_places/debug_utils.cpp b/src/place/recognition/user_places/debug_utils.cpp deleted file mode 100644 index b5fccf2..0000000 --- a/src/place/recognition/user_places/debug_utils.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "debug_utils.h" -#include - -std::string ctx::DebugUtils::humanReadableDateTime(time_t timestamp, std::string format, size_t size, bool utc) -{ - struct tm * timeinfo; - if (utc) { - format += " UTC"; - size += 4; - timeinfo = gmtime(×tamp); - } else { - timeinfo = localtime(×tamp); - } - char buffer[size]; - if (timeinfo) { - strftime(buffer, size, format.c_str(), timeinfo); - } else { - snprintf(buffer, size, "NULL"); - } - return std::string(buffer); -} diff --git a/src/place/recognition/user_places/debug_utils.h b/src/place/recognition/user_places/debug_utils.h deleted file mode 100644 index dde40bc..0000000 --- a/src/place/recognition/user_places/debug_utils.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_DEBUG_UTILS_H_ -#define _CONTEXT_PLACE_RECOGNITION_DEBUG_UTILS_H_ - -#include -#include - -namespace ctx { - - class DebugUtils { - - public: - static std::string humanReadableDateTime(time_t timestamp, std::string format, size_t size, bool utc = false); - - }; /* class DebugUtils */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_DEBUG_UTILS_H_ */ diff --git a/src/place/recognition/user_places/gmap.cpp b/src/place/recognition/user_places/gmap.cpp deleted file mode 100644 index 845b3cf..0000000 --- a/src/place/recognition/user_places/gmap.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "gmap.h" -#include -#include - -const std::string ctx::Gmap::__HTML_HEADER = R"( - - - - - - Simple markers - - - - - -
- - -)"; - -std::string ctx::Gmap::__iconForCategId(PlaceCategId categId) -{ - switch (categId) { - case PLACE_CATEG_ID_HOME: return "markerH.png"; - case PLACE_CATEG_ID_WORK: return "markerW.png"; - case PLACE_CATEG_ID_OTHER: return "markerO.png"; - case PLACE_CATEG_ID_NONE: return "markerN.png"; - default: return "markerD.png"; - } -} - -void ctx::Gmap::__placeMarker2Stream(const ctx::Place& place, std::ostream& out) -{ - if (place.locationValid) { - out << "new google.maps.Marker({" << std::endl; - out << " position: new google.maps.LatLng(" << place.location.latitude << "," << place.location.longitude << ")," << std::endl; - out << " map: map," << std::endl; - out << " icon: \"http://maps.google.com/mapfiles/" << __iconForCategId(place.categId)<< "\"" << std::endl; - out << "});" << std::endl; - } -} - -void ctx::Gmap::__html2Stream(const std::vector>& places, std::ostream& out) -{ - out << __HTML_HEADER; - for (std::shared_ptr place : places) { - __placeMarker2Stream(*place, out); - } - out << __HTML_FOOTER; -} - -void ctx::Gmap::writeMap(const std::vector>& places) -{ - std::ofstream out(GMAP_FILE); - __html2Stream(places, out); -} diff --git a/src/place/recognition/user_places/gmap.h b/src/place/recognition/user_places/gmap.h deleted file mode 100644 index 29eacd2..0000000 --- a/src/place/recognition/user_places/gmap.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_GMAP_H_ -#define _CONTEXT_PLACE_RECOGNITION_GMAP_H_ - -#include "user_places_types.h" -#include "../place_recognition_types.h" - -#define GMAP_FILE "/opt/usr/media/Others/user_places_map.html" - -namespace ctx { - - /* - * Class for generating a HTML page with GoogleMaps with all user places. - * This class is for test/demo purposes only. TODO: Remove this class from final solution. - */ - class Gmap { - - private: - static const std::string __HTML_HEADER; - static const std::string __HTML_FOOTER; - static std::string __iconForCategId(PlaceCategId categId); - static void __placeMarker2Stream(const Place& place, std::ostream& out); - static void __html2Stream(const std::vector>& places, std::ostream& out); - - public: - static void writeMap(const std::vector>& places); - - }; /* class Gmap */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_GMAP_H_ */ diff --git a/src/place/recognition/user_places/graph.cpp b/src/place/recognition/user_places/graph.cpp deleted file mode 100644 index 53daeb3..0000000 --- a/src/place/recognition/user_places/graph.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "graph.h" - -std::shared_ptr ctx::graph::connectedComponents(Graph &graph) -{ - std::shared_ptr ccs = std::make_shared(); - std::set fringe; - - for (Node i = 0; i < static_cast(graph.size()); i++) { - if (!graph[i]) { - continue; - } - // neighbourhood of node i exists (was not removed) - std::shared_ptr c = std::make_shared(); - ccs->push_back(c); - fringe.insert(i); - while (!fringe.empty()) { - Node currNode = *fringe.begin(); - fringe.erase(fringe.begin()); - c->insert(currNode); - - std::shared_ptr currNhood = graph[currNode]; - for (Node nhoodNode : *currNhood) { - if (graph[nhoodNode] && fringe.find(nhoodNode) == fringe.end()) { - fringe.insert(nhoodNode); - } - } - graph[currNode].reset(); // removing current node - } - } - return ccs; -} diff --git a/src/place/recognition/user_places/graph.h b/src/place/recognition/user_places/graph.h deleted file mode 100644 index 9fedb26..0000000 --- a/src/place/recognition/user_places/graph.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_GRAPH_H_ -#define _CONTEXT_PLACE_RECOGNITION_GRAPH_H_ - -#include -#include -#include - -namespace ctx { - -namespace graph { - - typedef int Node; - typedef std::set NeighbourNodes; - typedef std::vector> Graph; - typedef std::set Component; - typedef std::vector> Components; - - /* - * make connected components of a given graph - * caution: the graph will be changed (its nodes will be cleared) - */ - std::shared_ptr connectedComponents(Graph &graph); - -} /* namespace graph */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_GRAPH_H_ */ diff --git a/src/place/recognition/user_places/location_listener_iface.h b/src/place/recognition/user_places/location_listener_iface.h deleted file mode 100644 index 914e022..0000000 --- a/src/place/recognition/user_places/location_listener_iface.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_LOCATION_LISTENER_IFACE_H_ -#define _CONTEXT_PLACE_RECOGNITION_LOCATION_LISTENER_IFACE_H_ - -#include "user_places_types.h" - -namespace ctx { - - class ILocationListener { - - public: - virtual ~ILocationListener() {}; - virtual void onNewLocation(LocationEvent location) = 0; - - }; /* class ILocationListener */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_LOCATION_LISTENER_IFACE_H_ */ diff --git a/src/place/recognition/user_places/location_logger.cpp b/src/place/recognition/user_places/location_logger.cpp deleted file mode 100644 index 0994734..0000000 --- a/src/place/recognition/user_places/location_logger.cpp +++ /dev/null @@ -1,617 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include -#include "../place_recognition_types.h" -#include "user_places_params.h" -#include "debug_utils.h" -#include "location_logger.h" - -#ifdef TIZEN_ENGINEER_MODE -#define __LOCATION_CREATE_TABLE_COLUMNS \ - LOCATION_COLUMN_LATITUDE " REAL NOT NULL, "\ - LOCATION_COLUMN_LONGITUDE " REAL NOT NULL, "\ - LOCATION_COLUMN_ACCURACY " REAL, "\ - LOCATION_COLUMN_TIMESTAMP " timestamp NOT NULL, "\ - LOCATION_COLUMN_TIMESTAMP_HUMAN " TEXT, "\ - LOCATION_COLUMN_METHOD " INTEGER " -#else /* TIZEN_ENGINEER_MODE */ -#define __LOCATION_CREATE_TABLE_COLUMNS \ - LOCATION_COLUMN_LATITUDE " REAL NOT NULL, "\ - LOCATION_COLUMN_LONGITUDE " REAL NOT NULL, "\ - LOCATION_COLUMN_ACCURACY " REAL, "\ - LOCATION_COLUMN_TIMESTAMP " timestamp NOT NULL " -#endif /* TIZEN_ENGINEER_MODE */ - -#define __LOCATION_ERROR_LOG(error) { \ - if (error != LOCATIONS_ERROR_NONE) { \ - _E("ERROR == %s", __locationError2Str(error)); \ - } else { \ - _D("SUCCESS"); \ - } \ -} - -void ctx::LocationLogger::__locationServiceStateChangedCb(location_service_state_e state, void *userData) -{ - ctx::LocationLogger* locationLogger = (ctx::LocationLogger *)userData; - locationLogger->__locationServiceState = state; - if (state == LOCATIONS_SERVICE_ENABLED) { - _D("LOCATIONS_SERVICE_ENABLED"); - switch (locationLogger->__timerPurpose) { - case LOCATION_LOGGER_WAITING_FOR_SERVICE_START: - _D("Waiting for location service start FINISHED"); - locationLogger->__timerStop(); - locationLogger->__locationRequest(); - break; - case LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST: - case LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON: - case LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL: - case LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL: - default: - // Do nothing - break; - } - } else { - _D("LOCATIONS_SERVICE_DISABLED"); -// locationLogger->__timerStop(); - } -} - -void ctx::LocationLogger::__locationSettingChangedCb(location_method_e method, bool enable, void *userData) -{ - ctx::LocationLogger* locationLogger = (ctx::LocationLogger *)userData; - locationLogger->__locationMethodState = enable; - if (method == locationLogger->__locationMethod) { - if (enable) { - _D("Location method settings ON"); - switch (locationLogger->__timerPurpose) { - case LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON: - _D("Waiting for location method settings on FINISHED"); - if (locationLogger->__locationServiceState == LOCATIONS_SERVICE_ENABLED) { - locationLogger->__timerStop(); - locationLogger->__locationRequest(); - } else { - locationLogger->__locationManagerStart(); - } - break; - case LOCATION_LOGGER_WAITING_FOR_SERVICE_START: - case LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST: - case LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL: - case LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL: - default: - // Do nothing - break; - } - } else { - _D("Location method settings OFF"); -// locationLogger->__timerStop(); - } - } -} - -void ctx::LocationLogger::__positionUpdatedCb(double latitude, double longitude, - double altitude, time_t timestamp, void *userData) -{ - _D(""); - ctx::LocationLogger* locationLogger = (ctx::LocationLogger *)userData; - double horizontal = locationLogger->__locationManagerGetHorizontalAccuracy(); -#ifdef TIZEN_ENGINEER_MODE - ctx::LocationEvent location(latitude, longitude, horizontal, timestamp, LOCATION_METHOD_REQUEST); -#else /* TIZEN_ENGINEER_MODE */ - ctx::LocationEvent location(latitude, longitude, horizontal, timestamp); -#endif /* TIZEN_ENGINEER_MODE */ - locationLogger->__broadcast(location); - locationLogger->__onActiveRequestSucceeded(); -} - -void ctx::LocationLogger::__locationUpdatedCb(location_error_e error, double latitude, double longitude, - double altitude, time_t timestamp, double speed, double direction, double climb, void *userData) -{ - _D(""); - __positionUpdatedCb(latitude, longitude, altitude, timestamp, userData); -} - -const char* ctx::LocationLogger::__locationError2Str(int error) -{ - switch (error) { - case LOCATIONS_ERROR_NONE: - return "LOCATIONS_ERROR_NONE"; - case LOCATIONS_ERROR_OUT_OF_MEMORY: - return "LOCATIONS_ERROR_OUT_OF_MEMORY"; - case LOCATIONS_ERROR_INVALID_PARAMETER: - return "LOCATIONS_ERROR_INVALID_PARAMETER"; - case LOCATIONS_ERROR_ACCESSIBILITY_NOT_ALLOWED: - return "LOCATIONS_ERROR_ACCESSIBILITY_NOT_ALLOWED"; - case LOCATIONS_ERROR_NOT_SUPPORTED: - return "LOCATIONS_ERROR_NOT_SUPPORTED"; - case LOCATIONS_ERROR_INCORRECT_METHOD: - return "LOCATIONS_ERROR_INCORRECT_METHOD"; - case LOCATIONS_ERROR_NETWORK_FAILED: - return "LOCATIONS_ERROR_NETWORK_FAILED"; - case LOCATIONS_ERROR_SERVICE_NOT_AVAILABLE: - return "LOCATIONS_ERROR_SERVICE_NOT_AVAILABLE"; - case LOCATIONS_ERROR_GPS_SETTING_OFF: - return "LOCATIONS_ERROR_GPS_SETTING_OFF"; - case LOCATIONS_ERROR_SECURITY_RESTRICTED: - return "LOCATIONS_ERROR_SECURITY_RESTRICTED"; - default: - return "unknown location error code"; - } -} - - -void ctx::LocationLogger::__log(location_accessibility_state_e state) -{ - switch (state) { - case LOCATIONS_ACCESS_STATE_NONE : // Access state is not determined - _D("LOCATIONS_ACCESS_STATE_NONE "); - break; - case LOCATIONS_ACCESS_STATE_DENIED: // Access denied - _D("LOCATIONS_ACCESS_STATE_DENIED"); - break; - case LOCATIONS_ACCESS_STATE_ALLOWED: // Access authorized - _D("LOCATIONS_ACCESS_STATE_ALLOWED"); - break; - default: - break; - } -} - -int ctx::LocationLogger::__dbCreateTable() -{ - ctx::DatabaseManager dbManager; - bool ret = dbManager.createTable(0, LOCATION_TABLE_NAME, __LOCATION_CREATE_TABLE_COLUMNS, NULL, NULL); - _D("%s -> Table Creation Request", ret ? "SUCCESS" : "FAIL"); - return 0; -} - -int ctx::LocationLogger::__dbInsertLog(LocationEvent locationEvent) -{ - Json data; - data.set(NULL, LOCATION_COLUMN_LATITUDE, locationEvent.coordinates.latitude); - data.set(NULL, LOCATION_COLUMN_LONGITUDE, locationEvent.coordinates.longitude); - data.set(NULL, LOCATION_COLUMN_ACCURACY, locationEvent.coordinates.accuracy); - data.set(NULL, LOCATION_COLUMN_TIMESTAMP, static_cast(locationEvent.timestamp)); -#ifdef TIZEN_ENGINEER_MODE - std::string timeHuman = DebugUtils::humanReadableDateTime(locationEvent.timestamp, "%F %T", 80); - data.set(NULL, LOCATION_COLUMN_TIMESTAMP_HUMAN, timeHuman); - data.set(NULL, LOCATION_COLUMN_METHOD, static_cast(locationEvent.method)); -#endif /* TIZEN_ENGINEER_MODE */ - - ctx::DatabaseManager dbManager; - int64_t rowId; - bool ret = dbManager.insertSync(LOCATION_TABLE_NAME, data, &rowId); - _D("%s -> DB: location table insert result", ret ? "SUCCESS" : "FAIL"); - return ret; -} - -ctx::LocationLogger::LocationLogger(ILocationListener *listener, bool testMode) : - __listener(listener), - __testMode(testMode), - __activeRequestAttempts(0), - __activeAttempts(0), - __allAttempts(0), - __locationCount(0), - __activeRequestSucceeded(false), - __activeLocationSucceeded(false), - __timerId(-1), - __timerTimestamp(0), - __timerPurpose(LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL), - __locationServiceState(LOCATIONS_SERVICE_DISABLED), - __locationMethod(LOCATION_LOGGER_METHOD), - __locationMethodState(false) -{ - _D("CONSTRUCTOR"); - - __locationManagerCreate(); - - if (__testMode) { - return; - } - if (LOCATION_LOGGER_DATABASE) { - __dbCreateTable(); - } - - __locationManagerSetServiceStateChangedCb(); - __locationManagerSetSettingChangedCb(); - __locationMethodState = __locationManagerIsEnabledMethod(__locationMethod); -} - -ctx::LocationLogger::~LocationLogger() -{ - _D("DESTRUCTOR"); - __stopLogging(); - __locationManagerUnsetServiceStateChangedCb(); - __locationManagerUnsetSettingChangedCb(); - __locationManagerDestroy(); -} - -void ctx::LocationLogger::__locationManagerCreate() -{ - int ret = location_manager_create(__locationMethod, &__locationManager); - __LOCATION_ERROR_LOG(ret); -} - -void ctx::LocationLogger::__locationManagerDestroy() -{ - int ret = location_manager_destroy(__locationManager); - __LOCATION_ERROR_LOG(ret); -} - -void ctx::LocationLogger::__locationManagerSetServiceStateChangedCb() -{ - int ret = location_manager_set_service_state_changed_cb(__locationManager, __locationServiceStateChangedCb, this); - __LOCATION_ERROR_LOG(ret); -} - -void ctx::LocationLogger::__locationManagerUnsetServiceStateChangedCb() -{ - int ret = location_manager_unset_service_state_changed_cb(__locationManager); - __LOCATION_ERROR_LOG(ret); -} - -void ctx::LocationLogger::__locationManagerStart() -{ - int ret = location_manager_start(__locationManager); - __LOCATION_ERROR_LOG(ret); - __startServiceTimerStart(); -} - -void ctx::LocationLogger::__locationManagerStop() -{ - int ret = location_manager_stop(__locationManager); - __LOCATION_ERROR_LOG(ret); -} - -double ctx::LocationLogger::__locationManagerGetHorizontalAccuracy() -{ - location_accuracy_level_e accuracyLevel; - double horizontal, vertical; - int ret = location_manager_get_accuracy(__locationManager, &accuracyLevel, &horizontal, &vertical); - __LOCATION_ERROR_LOG(ret); - return horizontal; -} - -location_accessibility_state_e ctx::LocationLogger::__locationManagerGetAccessibilityState() -{ - location_accessibility_state_e state; - int ret = location_manager_get_accessibility_state(&state); - __LOCATION_ERROR_LOG(ret); - return state; -} - -void ctx::LocationLogger::__locationManagerSetSettingChangedCb() -{ - int ret = location_manager_set_setting_changed_cb(__locationMethod, __locationSettingChangedCb, this); - __LOCATION_ERROR_LOG(ret); -} - -void ctx::LocationLogger::__locationManagerUnsetSettingChangedCb() -{ - int ret = location_manager_unset_setting_changed_cb(__locationMethod); - __LOCATION_ERROR_LOG(ret); -} - -bool ctx::LocationLogger::__locationManagerRequestSingleLocation() -{ - int ret = location_manager_request_single_location(__locationManager, - LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS, __locationUpdatedCb, this); - _D("%s (seconds=%d) ----- ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d]", - ret == LOCATIONS_ERROR_NONE ? "SUCCESS" : "ERROR", - LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS, - __activeRequestAttempts, - LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, - __activeAttempts, - LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, - __allAttempts, - LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, - __locationCount, - LOCATION_LOGGER_MAX_LOCATION_COUNT); - __LOCATION_ERROR_LOG(ret); - __activeRequestAttempts++; - __activeAttempts++; - __allAttempts++; - if (ret == LOCATIONS_ERROR_NONE) { - __activeRequestTimerStart(); - return true; - } else { - return false; - } -} - -bool ctx::LocationLogger::__locationManagerGetLocation() -{ - double altitude, latitude, longitude, climb, direction, speed, horizontal, vertical; - location_accuracy_level_e level; - time_t timestamp; - int ret = location_manager_get_location(__locationManager, &altitude, &latitude, &longitude, - &climb, &direction, &speed, &level, &horizontal, &vertical, ×tamp); - _D("%s ----- ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d]", - ret == LOCATIONS_ERROR_NONE ? "SUCCESS" : "ERROR", - __activeRequestAttempts, - LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, - __activeAttempts, - LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, - __allAttempts, - LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, - __locationCount, - LOCATION_LOGGER_MAX_LOCATION_COUNT); - __LOCATION_ERROR_LOG(ret); - __activeAttempts++; - __allAttempts++; - if (ret == LOCATIONS_ERROR_NONE) { -#ifdef TIZEN_ENGINEER_MODE - ctx::LocationEvent location(latitude, longitude, horizontal, timestamp, LOCATION_METHOD_GET_LOCATION); -#else /* TIZEN_ENGINEER_MODE */ - ctx::LocationEvent location(latitude, longitude, horizontal, timestamp); -#endif /* TIZEN_ENGINEER_MODE */ - __broadcast(location); - __onActiveLocationSucceeded(); - return true; - } else { - return false; - } -} - -void ctx::LocationLogger::__locationManagerGetLastLocation() -{ - double altitude, latitude, longitude, climb, direction, speed, horizontal, vertical; - location_accuracy_level_e level; - time_t timestamp; - int ret = location_manager_get_last_location(__locationManager, &altitude, &latitude, &longitude, - &climb, &direction, &speed, &level, &horizontal, &vertical, ×tamp); - _D("%s ----- ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d]", - ret == LOCATIONS_ERROR_NONE ? "SUCCESS" : "ERROR", - __activeRequestAttempts, - LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, - __activeAttempts, - LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, - __allAttempts, - LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, - __locationCount, - LOCATION_LOGGER_MAX_LOCATION_COUNT); - __LOCATION_ERROR_LOG(ret); - __allAttempts++; - if (ret == LOCATIONS_ERROR_NONE) { -#ifdef TIZEN_ENGINEER_MODE - ctx::LocationEvent location(latitude, longitude, horizontal, timestamp, LOCATION_METHOD_GET_LAST_LOCATION); -#else /* TIZEN_ENGINEER_MODE */ - ctx::LocationEvent location(latitude, longitude, horizontal, timestamp); -#endif /* TIZEN_ENGINEER_MODE */ - __broadcast(location); - } -} - -bool ctx::LocationLogger::__locationManagerIsEnabledMethod(location_method_e method) -{ - bool enable; - int ret = location_manager_is_enabled_method(method, &enable); - __LOCATION_ERROR_LOG(ret); - return enable; -} - -bool ctx::LocationLogger::__checkGeneralLimits() -{ - return (__locationCount < LOCATION_LOGGER_MAX_LOCATION_COUNT - && __allAttempts < LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS); -} - -bool ctx::LocationLogger::__checkActiveLimits() -{ - return (!__activeLocationSucceeded - && __activeAttempts < LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS); -} - -bool ctx::LocationLogger::__checkActiveRequestLimits() -{ - return (!__activeRequestSucceeded - && __activeRequestAttempts < LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS); -} - -void ctx::LocationLogger::__locationRequest() -{ - _D(""); - bool requestSingleLocationRet = false; - bool getLocationRet = false; - if (__checkGeneralLimits() && __checkActiveLimits() && __checkActiveRequestLimits()) { - requestSingleLocationRet = __locationManagerRequestSingleLocation(); - } - if (__checkGeneralLimits() && __checkActiveLimits() && !requestSingleLocationRet) { - getLocationRet = __locationManagerGetLocation(); - } - if (__checkGeneralLimits() && !requestSingleLocationRet && !getLocationRet - && __activeAttempts >= LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS) { - __locationManagerGetLastLocation(); - } - if (!requestSingleLocationRet) { - __locationManagerStop(); - __setNextTimer(); - } -} - -void ctx::LocationLogger::__setNextTimer() -{ - _D("ATTEMPTS: REQ[%d/%d], ACT[%d/%d], ALL[%d/%d]; ----- LOCATIONS:[%d/%d])", - __activeRequestAttempts, - LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS, - __activeAttempts, - LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS, - __allAttempts, - LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS, - __locationCount, - LOCATION_LOGGER_MAX_LOCATION_COUNT); - if (__checkGeneralLimits()) { - if (__checkActiveLimits()) { - __activeIntervalTimerStart(); - } else { - __passiveIntervalTimerStart(); - } - } -} - -void ctx::LocationLogger::__onActiveRequestSucceeded() -{ - _D(""); - __locationManagerStop(); - __activeRequestSucceeded = true; - __onActiveLocationSucceeded(); -} - -void ctx::LocationLogger::__onActiveLocationSucceeded() -{ - _D(""); - __activeLocationSucceeded = true; -} - -void ctx::LocationLogger::__broadcast(ctx::LocationEvent locationEvent) -{ - _D(""); - __locationCount++; - if (__listener) { - __listener->onNewLocation(locationEvent); - } - if (LOCATION_LOGGER_DATABASE) { - __dbInsertLog(locationEvent); - } -} - -bool ctx::LocationLogger::onTimerExpired(int id) -{ - time_t now = time(nullptr); - double seconds = difftime(now, __timerTimestamp); - - switch (__timerPurpose) { - case LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST: - _D("Active request FAILED, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); - __locationManagerStop(); - __setNextTimer(); - return false; - case LOCATION_LOGGER_WAITING_FOR_SERVICE_START: - _D("Service start in timeout time FAILED, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); - // Waiting for service start FAILURE is also some kind of active request attempt - __activeRequestAttempts++; - __activeAttempts++; - __allAttempts++; - __locationManagerStop(); - __setNextTimer(); - return false; - case LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON: - _D("Still waiting for Location method settings on, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); - // Do nothing - return false; - case LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL: - _D("Active interval time expired, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); - break; - case LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL: - _D("Passive interval time expired, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); - break; - default: - _D("Do nothing, timerId = %d[%d], from start = %.1fs", id, __timerId, seconds); - return false; - } - if (__locationMethodState) { - __locationManagerStart(); - } else { - __timerPurpose = LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON; - _D("LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON"); - } - return false; -} - -void ctx::LocationLogger::__activeRequestTimerStart() -{ - int minutes = LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS / 60; - if (LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS % 60) { - minutes++; - } - __timerPurpose = LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST; - _D("LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST (minutes=%d)", minutes); - __timerStart(minutes); -} - -void ctx::LocationLogger::__startServiceTimerStart() -{ - __timerPurpose = LOCATION_LOGGER_WAITING_FOR_SERVICE_START; - _D("LOCATION_LOGGER_WAITING_FOR_SERVICE_START"); - __timerStart(LOCATION_LOGGER_SERVICE_START_TIMEOUT_MINUTES); -} - -void ctx::LocationLogger::__activeIntervalTimerStart() -{ - __timerPurpose = LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL; - _D("LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL"); - __timerStart(LOCATION_LOGGER_ACTIVE_INTERVAL_MINUTES); -} - -void ctx::LocationLogger::__passiveIntervalTimerStart() -{ - __timerPurpose = LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL; - _D("LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL"); - __timerStart(LOCATION_LOGGER_PASSIVE_INTERVAL_MINUTES); -} - -void ctx::LocationLogger::__timerStart(time_t minutes) -{ - __timerTimestamp = time(nullptr); - __timerId = __timerManager.setFor(minutes, this); - _D("%s (minutes=%d) timerId = %d", __timerId >= 0 ? "SUCCESS" : "ERROR", minutes, __timerId); -} - -void ctx::LocationLogger::__timerStop() -{ - _D(""); - __timerManager.remove(__timerId); -} - -void ctx::LocationLogger::__startLogging() -{ - _D(""); - __activeRequestAttempts = 0; - __activeAttempts = 0; - __allAttempts = 0; - __locationCount = 0; - __activeRequestSucceeded = false;; - __activeLocationSucceeded = false; - __locationManagerStart(); -} - -void ctx::LocationLogger::__stopLogging() -{ - _D(""); - __timerStop(); - __locationManagerStop(); -} - -void ctx::LocationLogger::onVisitStart() -{ - _D(""); - if (!__testMode) { - __startLogging(); - } -} - -void ctx::LocationLogger::onVisitEnd() -{ - _D(""); - if (!__testMode) { - __stopLogging(); - } -} - -#undef __LOCATION_ERROR_LOG diff --git a/src/place/recognition/user_places/location_logger.h b/src/place/recognition/user_places/location_logger.h deleted file mode 100644 index ae4c9bd..0000000 --- a/src/place/recognition/user_places/location_logger.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_LOCATION_LOGGER_H_ -#define _CONTEXT_PLACE_RECOGNITION_LOCATION_LOGGER_H_ - -#include -#include -#include "visit_listener_iface.h" -#include "location_listener_iface.h" - -/* Database usage flag */ -#define LOCATION_LOGGER_DATABASE false // TODO: false in final solution - -/* Locations measure method */ -#define LOCATION_LOGGER_METHOD LOCATIONS_METHOD_HYBRID - -/* TIMEOUTS: Location active measure request timeout (in seconds). */ -#define LOCATION_LOGGER_ACTIVE_REQUEST_TIMEOUT_SECONDS 100 - -/* TIMEOUTS: Location service start timeout (in minutes). */ -#define LOCATION_LOGGER_SERVICE_START_TIMEOUT_MINUTES 2 - -/* FREQUENCIES/INTERVALS: "Active" measure attempts frequency (in minutes) */ -#define LOCATION_LOGGER_ACTIVE_INTERVAL_MINUTES 5 - -/* FREQUENCIES/INTERVALS: "Passive" measure attempts frequency (in minutes) */ -#define LOCATION_LOGGER_PASSIVE_INTERVAL_MINUTES 30 - -/* ATTEMTS LIMITS: "Active" request attempts limit (must be <= than active location attempts) */ -#define LOCATION_LOGGER_MAX_ACTIVE_REQUEST_ATTEMPTS 0 - -/* ATTEMTS LIMITS: "Active" measures attempts limit (must be <= than all attempts limit) */ -#define LOCATION_LOGGER_MAX_ACTIVE_LOCATION_ATTEMPTS 2 - -/* ATTEMTS LIMITS: All attempts ("active" + "passive") limit */ -#define LOCATION_LOGGER_MAX_LOCATION_ATTEMPTS 3 - -/* LOCATION LIMIT: Location count limit per visit */ -#define LOCATION_LOGGER_MAX_LOCATION_COUNT 3 - -namespace ctx { - - enum TimerPurpose { - LOCATION_LOGGER_WAITING_FOR_ACTIVE_REQUEST = 0, - LOCATION_LOGGER_WAITING_FOR_SERVICE_START = 1, - LOCATION_LOGGER_WAITING_FOR_LOCATION_METHOD_SETTING_ON = 2, - LOCATION_LOGGER_WAITING_FOR_ACTIVE_INTERVAL = 3, - LOCATION_LOGGER_WAITING_FOR_PASSIVE_INTERVAL = 4 - }; - - class LocationLogger : public ITimerListener, public IVisitListener { - - public: - LocationLogger(ILocationListener *listener = nullptr, bool testMode = false); - ~LocationLogger(); - - private: - /* INPUT */ - void onVisitStart(); - void onVisitEnd(); - - /* OUTPUT */ - ILocationListener * const __listener; - void __broadcast(LocationEvent locationEvent); - - /* INTERNAL */ - bool __testMode; - void __startLogging(); - void __stopLogging(); - void __locationRequest(); - void __onActiveRequestSucceeded(); - void __onActiveLocationSucceeded(); - - /* INTERNAL : COUNTERS (LIMITS) */ - int __activeRequestAttempts; - int __activeAttempts; - int __allAttempts; - int __locationCount; - bool __checkGeneralLimits(); - bool __checkActiveLimits(); - bool __checkActiveRequestLimits(); - - /* INTERNAL : FLAGS */ - bool __activeRequestSucceeded; - bool __activeLocationSucceeded; - - /* TIMER */ - int __timerId; - time_t __timerTimestamp; - TimerManager __timerManager; - TimerPurpose __timerPurpose; - void __setNextTimer(); - void __activeRequestTimerStart(); - void __startServiceTimerStart(); - void __activeIntervalTimerStart(); - void __passiveIntervalTimerStart(); - void __timerStart(time_t minutes); - void __timerStop(); - bool onTimerExpired(int timerId); - - /* DATABASE */ - static int __dbCreateTable(); - int __dbInsertLog(LocationEvent locationEvent); - - /* DEBUG */ - static const char* __locationError2Str(int error); - static void __log(location_accessibility_state_e state); - - /* LOCATION MANAGER */ - location_manager_h __locationManager; - void __locationManagerCreate(); - void __locationManagerDestroy(); - void __locationManagerStart(); - void __locationManagerStop(); - location_accessibility_state_e __locationManagerGetAccessibilityState(); - - /* LOCATION MANAGER : LOCATION SERVICE STATE */ - location_service_state_e __locationServiceState; - static void __locationServiceStateChangedCb(location_service_state_e state, void *userData); - void __locationManagerSetServiceStateChangedCb(); - void __locationManagerUnsetServiceStateChangedCb(); - - /* LOCATION MANAGER : LOCATION METHOD SETTINGS */ - location_method_e __locationMethod; - bool __locationMethodState; - bool __locationManagerIsEnabledMethod(location_method_e method); - static void __locationSettingChangedCb(location_method_e method, bool enable, void *userData); - void __locationManagerSetSettingChangedCb(); - void __locationManagerUnsetSettingChangedCb(); - - /* LOCATION MANAGER : LOCATION */ - double __locationManagerGetHorizontalAccuracy(); - - /* LOCATION MANAGER : LOCATION : SYNCHRONOUS */ - bool __locationManagerGetLocation(); - void __locationManagerGetLastLocation(); - - /* LOCATION MANAGER : LOCATION : ASYNCHRONOUS */ - static void __positionUpdatedCb(double latitude, double longitude, - double altitude, time_t timestamp, void *userData); - static void __locationUpdatedCb(location_error_e error, double latitude, - double longitude, double altitude, time_t timestamp, double speed, - double direction, double climb, void *userData); - bool __locationManagerRequestSingleLocation(); - - }; /* class LocationLogger */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_LOCATION_LOGGER_H_ */ diff --git a/src/place/recognition/user_places/mahal.cpp b/src/place/recognition/user_places/mahal.cpp deleted file mode 100644 index ccc7f9f..0000000 --- a/src/place/recognition/user_places/mahal.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "mahal.h" -#include -#include - -ctx::num_t ctx::MahalModel::distance(const std::vector &v1, const std::vector &v2, const std::vector &m) -{ - size_t n = v1.size(); - if (m.size() != n * n) { - _E("m.size() != n * n"); - return 0.0; // this value does not make any sense - } - - std::vector diff(n); - for (size_t i = 0; i < n; i++) { - diff[i] = v2[i] - v1[i]; - } - - num_t dist2 = 0; // squared distance - for (size_t j = 0; j < n; j++) { - for (size_t i = 0; i < n; i++) { - dist2 += m[i * n + j] * diff[i] * diff[j]; - } - } - return sqrt(dist2); -} - -ctx::num_t ctx::MahalModel::distance(const std::vector &v) -{ - return distance(v, __mean, __sigma); -} diff --git a/src/place/recognition/user_places/mahal.h b/src/place/recognition/user_places/mahal.h deleted file mode 100644 index 9e733c7..0000000 --- a/src/place/recognition/user_places/mahal.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_MAHAL_H_ -#define _CONTEXT_PLACE_RECOGNITION_MAHAL_H_ - -#include -#include "user_places_types.h" - -namespace ctx { - - /* - * Class for Mahalanobis distance computation. - */ - class MahalModel { - - private: - std::vector __mean; - std::vector __sigma; // represents square matrix row-wise - - public: - static num_t distance(const std::vector &v1, const std::vector &v2, const std::vector &m); - MahalModel(std::vector mean, std::vector sigma) : - __mean(mean), - __sigma(sigma) { } - num_t distance(const std::vector &v); - - }; /* class MahalModel */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_MAHAL_H_ */ diff --git a/src/place/recognition/user_places/median.cpp b/src/place/recognition/user_places/median.cpp deleted file mode 100644 index f0463b3..0000000 --- a/src/place/recognition/user_places/median.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "median.h" - -ctx::num_t ctx::median(std::vector &v) -{ - if (v.empty()) { - _E("Median of empty set"); - return 0; // this value does not make any sense - } - size_t n = v.size() / 2; - std::nth_element(v.begin(), v.begin() + n, v.end()); - num_t vn = v[n]; - if (v.size() % 2 == 1) { - return vn; - } else { - std::nth_element(v.begin(), v.begin() + n - 1, v.end()); - return 0.5 * (vn + v[n - 1]); - } -} diff --git a/src/place/recognition/user_places/median.h b/src/place/recognition/user_places/median.h deleted file mode 100644 index 70461ae..0000000 --- a/src/place/recognition/user_places/median.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_MEDIAN_ -#define _CONTEXT_PLACE_RECOGNITION_MEDIAN_ - -#include "user_places_types.h" -#include -#include "../place_recognition_types.h" - -namespace ctx { - - num_t median(std::vector &values); // caution: the input vector will be sorted - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_MEDIAN_ */ diff --git a/src/place/recognition/user_places/piecewise_lin.cpp b/src/place/recognition/user_places/piecewise_lin.cpp deleted file mode 100644 index 638af66..0000000 --- a/src/place/recognition/user_places/piecewise_lin.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "piecewise_lin.h" -#include - -ctx::PiecewiseLin::PiecewiseLin(std::vector xs, std::vector vs) : - __xs(xs), - __vs(vs), - __n(xs.size()) -{ - if (xs.size() != vs.size()) { - _E("Input arguments have different sizes"); - return; - } -} - -ctx::num_t ctx::PiecewiseLin::value(num_t x) -{ - if (x <= __xs[0]) { - return __vs[0]; - } else if (x >= __xs[__n-1]) { - return __vs[__n - 1]; - } else { - num_t xp = __xs[0]; - for (size_t i = 1; i < __n; i++) { - num_t xn = __xs[i]; - if (x <= xn) { - num_t d = xn - xp; - num_t dxp = x - xp; - num_t dxn = xn - x; - return (dxn * __vs[i-1] + dxp * __vs[i]) / d; - } - xp = xn; - } - } - _E("Function should return result earlier"); - return 0.0; // this value does not make any sense -} diff --git a/src/place/recognition/user_places/piecewise_lin.h b/src/place/recognition/user_places/piecewise_lin.h deleted file mode 100644 index 0ef4bff..0000000 --- a/src/place/recognition/user_places/piecewise_lin.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_PIECEWISE_LIN_ -#define _CONTEXT_PLACE_RECOGNITION_PIECEWISE_LIN_ - -#include "user_places_types.h" - -namespace ctx { - - /* - * Piecewise linear function. Used for approximation. - */ - class PiecewiseLin { - - private: - std::vector __xs; // nodes - std::vector __vs; // values in nodes - size_t __n; - - public: - PiecewiseLin(std::vector xs, std::vector vs); - num_t value(num_t x); - - }; /* PiecewiseLin */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_PIECEWISE_LIN_ */ diff --git a/src/place/recognition/user_places/place_categer.cpp b/src/place/recognition/user_places/place_categer.cpp deleted file mode 100644 index 1b4c975..0000000 --- a/src/place/recognition/user_places/place_categer.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "place_categer.h" -#include "median.h" -#include "../place_recognition_types.h" -#include "user_places_params.h" -#include "user_places_types.h" -#include -#include - -void ctx::PlaceCateger::reduceOutliers(ctx::Visits &visits) -{ - int size = visits.size(); - visits.erase(std::remove_if( - visits.begin(), - visits.end(), - [](Visit v)->bool { - return v.categs[PLACE_CATEG_ID_HOME] < PLACES_CATEGER_MIN_VISITS_SCORE - && v.categs[PLACE_CATEG_ID_WORK] < PLACES_CATEGER_MIN_VISITS_SCORE - && v.categs[PLACE_CATEG_ID_OTHER] < PLACES_CATEGER_MIN_VISITS_SCORE; - }), - visits.end()); - int newSize = visits.size(); - if (size != newSize) { - _D("Visits number from %d to %d (visits min scores checking)", size, newSize); - } -} - -/* - * Change category if home or work has to few visits - */ -bool ctx::PlaceCateger::__reduceCategory(const PlaceCategId &categId, const ctx::Visits &visits) -{ - return (categId == PLACE_CATEG_ID_HOME && visits.size() < PLACES_CATEGER_MIN_VISITS_PER_HOME) - || (categId == PLACE_CATEG_ID_WORK && visits.size() < PLACES_CATEGER_MIN_VISITS_PER_WORK); -} - -void ctx::PlaceCateger::categorize(ctx::Visits &visits, ctx::Place &place) -{ - reduceOutliers(visits); - - place.categId = PLACE_CATEG_ID_NONE; - place.categConfidence = 0.0; - - if (!visits.empty()) { - const std::vector categIds = { - PLACE_CATEG_ID_HOME, - PLACE_CATEG_ID_WORK, - PLACE_CATEG_ID_OTHER - }; - num_t sumScore = 0.0; - num_t maxScore = 0.0; - for (PlaceCategId categId : categIds) { - std::vector categVector = categVectorFromVisits(visits, categId); - num_t score = median(categVector); - sumScore += score; - if (score > maxScore) { - maxScore = score; - place.categId = categId; - } - } - if (sumScore > 0) { - place.categConfidence = maxScore / sumScore; - } - if (__reduceCategory(place.categId, visits)) { - place.categId = PLACE_CATEG_ID_OTHER; - place.categConfidence = 0.0; - } - } - - place.name = categId2Name(place.categId); -} - -std::vector ctx::PlaceCateger::categVectorFromVisits(const ctx::Visits &visits, PlaceCategId categId) -{ - std::vector vec; - for (auto &visit : visits) { - auto search = visit.categs.find(categId); - if (search != visit.categs.end()) { - vec.push_back(search->second); - } - } - return vec; -} - -std::string ctx::PlaceCateger::categId2Name(PlaceCategId categId) { - switch (categId) { - case PLACE_CATEG_ID_HOME: - return "home"; - case PLACE_CATEG_ID_WORK: - return "work"; - case PLACE_CATEG_ID_OTHER: - return "other"; - case PLACE_CATEG_ID_NONE: - return "none"; - default: - return ""; - } -} diff --git a/src/place/recognition/user_places/place_categer.h b/src/place/recognition/user_places/place_categer.h deleted file mode 100644 index 0d127b1..0000000 --- a/src/place/recognition/user_places/place_categer.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_PLACE_CATEGER_ -#define _CONTEXT_PLACE_RECOGNITION_PLACE_CATEGER_ - -#include "user_places_types.h" -#include -#include -#include -#include "../place_recognition_types.h" - -namespace ctx { - - class PlaceCateger { - - private: - static bool __reduceCategory(const PlaceCategId &categId, const ctx::Visits &visits); - - public: - static void reduceOutliers(Visits &visits); // TODO: move to private - static std::vector categVectorFromVisits(const ctx::Visits &visits, PlaceCategId categId); // TODO: move to private - static void categorize(ctx::Visits &visits, ctx::Place &place); - static std::string categId2Name(PlaceCategId categId); // TODO: move to private - - }; /* class PlaceCateger */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_PLACE_CATEGER_ */ diff --git a/src/place/recognition/user_places/places_detector.cpp b/src/place/recognition/user_places/places_detector.cpp deleted file mode 100644 index a48e395..0000000 --- a/src/place/recognition/user_places/places_detector.cpp +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "similarity.h" -#include "places_detector.h" -#include "place_categer.h" -#include "graph.h" -#include "median.h" -#ifdef TIZEN_ENGINEER_MODE -#include "gmap.h" -#endif /* TIZEN_ENGINEER_MODE */ -#include "../place_recognition_types.h" -#include -#include -#include "user_places_params.h" - -#define __DELETE_PLACES_QUERY "DELETE FROM " PLACE_TABLE - -#ifdef TIZEN_ENGINEER_MODE -#define __USER_PLACES_FILE "/opt/usr/media/Others/user_places.txt" // TODO: Only for debug purposes -> Remove in final solution -#endif /* TIZEN_ENGINEER_MODE */ - -#define __GET_VISITS_QUERY "SELECT "\ - VISIT_COLUMN_END_TIME ", "\ - VISIT_COLUMN_START_TIME ", "\ - VISIT_COLUMN_WIFI_APS ", "\ - VISIT_COLUMN_LOCATION_VALID ", "\ - VISIT_COLUMN_LOCATION_LATITUDE ", "\ - VISIT_COLUMN_LOCATION_LONGITUDE ", " \ - VISIT_COLUMN_CATEG_HOME ", "\ - VISIT_COLUMN_CATEG_WORK ", "\ - VISIT_COLUMN_CATEG_OTHER \ - " FROM " VISIT_TABLE - -#define __GET_PLACES_QUERY "SELECT "\ - PLACE_COLUMN_CATEG_ID ", "\ - PLACE_COLUMN_CATEG_CONFIDENCE ", "\ - PLACE_COLUMN_NAME ", "\ - PLACE_COLUMN_LOCATION_VALID ", "\ - PLACE_COLUMN_LOCATION_LATITUDE ", "\ - PLACE_COLUMN_LOCATION_LONGITUDE ", " \ - PLACE_COLUMN_WIFI_APS ", "\ - PLACE_COLUMN_CREATE_DATE \ - " FROM " PLACE_TABLE - -#define __PLACE_TABLE_COLUMNS \ - PLACE_COLUMN_CATEG_ID " INTEGER, "\ - PLACE_COLUMN_CATEG_CONFIDENCE " REAL, "\ - PLACE_COLUMN_NAME " TEXT, "\ - PLACE_COLUMN_LOCATION_VALID " INTEGER, "\ - PLACE_COLUMN_LOCATION_LATITUDE " REAL, "\ - PLACE_COLUMN_LOCATION_LONGITUDE " REAL, "\ - PLACE_COLUMN_WIFI_APS " STRING, "\ - PLACE_COLUMN_CREATE_DATE " timestamp" - -bool ctx::PlacesDetector::onTimerExpired(int timerId) -{ - _D(""); - __dbDeletePlaces(); - __dbDeleteOldVisits(); - std::vector records = __dbGetVisits(); - Visits visits = __visitsFromJsons(records); - __processVisits(visits); - return true; -} - -std::vector ctx::PlacesDetector::__dbGetVisits() -{ - std::vector records; - bool ret = __dbManager.executeSync(__GET_VISITS_QUERY, &records); - _D("load visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); - return records; -} - -std::vector ctx::PlacesDetector::__dbGetPlaces() -{ - std::vector records; - bool ret = __dbManager.executeSync(__GET_PLACES_QUERY, &records); - _D("load places execute query result: %s", ret ? "SUCCESS" : "FAIL"); - return records; -} - -double ctx::PlacesDetector::__doubleValueFromJson(Json &row, const char* key) -{ - double value; - row.get(NULL, key, &value); - _D("__doubleValueFromJson, key:%s, value: %lf", key, value); - return value; -} - -ctx::Categs ctx::PlacesDetector::__visitCategsFromJson(Json &row) -{ - Categs categs; - categs[PLACE_CATEG_ID_HOME] = __doubleValueFromJson(row, VISIT_COLUMN_CATEG_HOME); - categs[PLACE_CATEG_ID_WORK] = __doubleValueFromJson(row, VISIT_COLUMN_CATEG_WORK); - categs[PLACE_CATEG_ID_OTHER] = __doubleValueFromJson(row, VISIT_COLUMN_CATEG_OTHER); - return categs; -} - -ctx::Visit ctx::PlacesDetector::__visitFromJson(Json &row) -{ - int startTime; - int endTime; - std::string str; - row.get(NULL, VISIT_COLUMN_START_TIME, &startTime); - row.get(NULL, VISIT_COLUMN_END_TIME, &endTime); - row.get(NULL, VISIT_COLUMN_WIFI_APS, &str); - - std::stringstream ss; - ss << str; - std::shared_ptr macSet = std::make_shared(); - ss >> *macSet; - - Interval interval(startTime, endTime); - Categs categs = __visitCategsFromJson(row); - - Visit visit(interval, macSet, categs); - - { // location - int locationValidInt; - row.get(NULL, VISIT_COLUMN_LOCATION_VALID, &locationValidInt); - visit.locationValid = (bool) locationValidInt; - row.get(NULL, VISIT_COLUMN_LOCATION_LATITUDE, &(visit.location.latitude)); - row.get(NULL, VISIT_COLUMN_LOCATION_LONGITUDE, &(visit.location.longitude)); - } - - return visit; -} - -ctx::Visits ctx::PlacesDetector::__visitsFromJsons(std::vector& records) -{ - Visits visits; - _D("db_result: number of all visits: %d", records.size()); - - for (Json &row : records) { - Visit visit = __visitFromJson(row); - visits.push_back(visit); - } - _D("number of all visits in vector: %d", visits.size()); - return visits; -} - -std::shared_ptr ctx::PlacesDetector::__placeFromJson(Json &row) -{ - std::shared_ptr place = std::make_shared(); - { // category - int categId; - row.get(NULL, PLACE_COLUMN_CATEG_ID, &categId); - // This is due to the fact the JSON module API interface doesn't handle enum - place->categId = static_cast(categId); - } - row.get(NULL, PLACE_COLUMN_NAME, &(place->name)); - row.get(NULL, PLACE_COLUMN_WIFI_APS, &(place->wifiAps)); - { // location - int locationValidInt; - row.get(NULL, PLACE_COLUMN_LOCATION_VALID, &locationValidInt); - place->locationValid = (bool) locationValidInt; - row.get(NULL, PLACE_COLUMN_LOCATION_LATITUDE, &(place->location.latitude)); - row.get(NULL, PLACE_COLUMN_LOCATION_LONGITUDE, &(place->location.longitude)); - } - { // createDate - int createDate; - row.get(NULL, PLACE_COLUMN_CREATE_DATE, &(createDate)); - // This is due to the fact the JSON module API interface doesn't handle time_t - place->createDate = static_cast(createDate); - } - _D("db_result: categId: %d; place: name: %s; wifiAps: %s; locationValid: %d; latitude: %lf, longitude: %lf, createDate: %d", place->categId, place->name.c_str(), place->wifiAps.c_str(), place->locationValid, place->location.latitude, place->location.longitude, place->createDate); - return place; -} - -std::vector> ctx::PlacesDetector::__placesFromJsons(std::vector& records) -{ - std::vector> places; - _D("db_result: number of all places: %d", records.size()); - - for (Json &row : records) { - std::shared_ptr place = __placeFromJson(row); - places.push_back(place); - } - _D("number of all places in vector: %d", places.size()); - return places; -} - -void ctx::PlacesDetector::reduceOutliers(ctx::Visits &visits) -{ - int size = visits.size(); - visits.erase(std::remove_if( - visits.begin(), - visits.end(), - [](Visit v)->bool { - int minutes = (v.interval.end - v.interval.start) / 60; - return (minutes < PLACES_DETECTOR_MIN_VISIT_DURATION_MINUTES) - || (minutes > PLACES_DETECTOR_MAX_VISIT_DURATION_MINUTES); - }), - visits.end()); - int newSize = visits.size(); - if (size != newSize) { - _D("Visits number from %d to %d (to short and to long reduction)", size, newSize); - } -} - -void ctx::PlacesDetector::__processVisits(ctx::Visits &visits) -{ - reduceOutliers(visits); - - _D("__testMode = %d", __testMode); - auto components = __mergeVisits(visits); - std::vector> newDetectedPlaces; -#ifdef TIZEN_ENGINEER_MODE - std::vector placesVisits; // TODO: remove from final solution. -#endif /* TIZEN_ENGINEER_MODE */ - for (std::shared_ptr component : *components) { - // Small places outliers reduction - if (!__testMode && component->size() < PLACES_DETECTOR_MIN_VISITS_PER_BIG_PLACE) { - continue; - } - - std::shared_ptr merged = std::make_shared(); - for (graph::Node i : *component) { - merged->push_back(visits[i]); - } - std::shared_ptr place = __placeFromMergedVisits(*merged); - if (place->categId == PLACE_CATEG_ID_NONE) { - continue; - } - newDetectedPlaces.push_back(place); - if (!__testMode) { - __dbInsertPlace(*place); - } - -#ifdef TIZEN_ENGINEER_MODE - { // TODO: Only for debug -> remove in final solution - Visits placeVisits; - for (graph::Node i : *component) { - placeVisits.push_back(visits[i]); - } - placesVisits.push_back(placeVisits); - } -#endif /* TIZEN_ENGINEER_MODE */ - } - - __detectedPlacesUpdate(newDetectedPlaces); - -#ifdef TIZEN_ENGINEER_MODE - { // Print to file TODO: Only for debug -> remove in final solution - std::ofstream out(__USER_PLACES_FILE); - for (size_t i = 0; i < newDetectedPlaces.size(); i++) { - newDetectedPlaces[i]->print2Stream(out); - Visits placeVisits = placesVisits[i]; - for (Visit visit : placeVisits) { - visit.printShort2Stream(out); - } - } - out.close(); - Gmap::writeMap(newDetectedPlaces); - } -#endif /* TIZEN_ENGINEER_MODE */ -} - -/* - * Replace old places by new ones. - */ -void ctx::PlacesDetector::__detectedPlacesUpdate(std::vector> &newPlaces) -{ - _D(""); - // XXX: In case of thread safety issues use std::mutex to protect places list. - __detectedPlaces = newPlaces; -} - -void ctx::PlacesDetector::__mergeLocation(const Visits &visits, Place &place) -{ - place.locationValid = false; - std::vector latitudes; - std::vector longitudes; - for (const Visit& visit : visits) { - if (visit.locationValid) { - latitudes.push_back(visit.location.latitude); - longitudes.push_back(visit.location.longitude); - place.locationValid = true; - } - } - if (place.locationValid) { - place.location.latitude = median(latitudes); - place.location.longitude = median(longitudes); - } -} - -std::shared_ptr ctx::PlacesDetector::__placeFromMergedVisits(Visits &mergedVisits) -{ - std::shared_ptr place = std::make_shared(); - place->createDate = std::time(nullptr); - std::vector> macSets; - for (const Visit &visit : mergedVisits) { - macSets.push_back(visit.macSet); - } - std::shared_ptr allMacs = macSetsUnion(macSets); - std::stringstream ss; - ss << *allMacs; - place->wifiAps = ss.str(); - - __mergeLocation(mergedVisits, *place); - - PlaceCateger::categorize(mergedVisits, *place); - - return place; -} - -void ctx::PlacesDetector::reduceOutliers(std::shared_ptr &cc) -{ - int size = cc->size(); - cc->erase(std::remove_if(cc->begin(), - cc->end(), - [](std::shared_ptr &c)->bool { - return c->size() < PLACES_DETECTOR_MIN_VISITS_PER_PLACE; - }), - cc->end()); - int newSize = cc->size(); - if (size != newSize) { - _D("Connected components from %d to %d (min visit per place)", size, newSize); - } -} - -std::shared_ptr ctx::PlacesDetector::__mergeVisits(const std::vector &visits) -{ - auto graph = __graphFromVisits(visits); - auto cc = graph::connectedComponents(*graph); - reduceOutliers(cc); - return cc; -} - -std::shared_ptr ctx::PlacesDetector::__graphFromVisits(const std::vector &visits) -{ - std::shared_ptr graph = std::make_shared(); - graph->resize(visits.size()); - for (size_t i = 0; i < visits.size(); i++) { - (*graph)[i] = std::make_shared(); - for (size_t j = 0; j < i; j++) { - if (similarity::isJoint(*visits[i].macSet, *visits[j].macSet)) { - (*graph)[i]->insert(j); - (*graph)[j]->insert(i); - } - } - } - return graph; -} - -void ctx::PlacesDetector::__dbDeletePlaces() -{ - std::vector records; - bool ret = __dbManager.executeSync(__DELETE_PLACES_QUERY, &records); - _D("delete places execute query result: %s", ret ? "SUCCESS" : "FAIL"); -} - -void ctx::PlacesDetector::__dbDeleteOldVisits() -{ - time_t currentTime; - time(¤tTime); - time_t thresholdTime = currentTime - PLACES_DETECTOR_RETENTION_SECONDS; - __dbDeleteOlderVisitsThan(thresholdTime); -} - -void ctx::PlacesDetector::__dbDeleteOlderVisitsThan(time_t threshold) -{ - _D("deleting vistits older than: %d", threshold); - std::stringstream query; - query << "DELETE FROM " << VISIT_TABLE; - query << " WHERE " << VISIT_COLUMN_END_TIME << " < " << threshold; - // query << " AND 0"; // XXX: Always false condition. Uncomment it for not deleting any visit during development. - std::vector records; - bool ret = __dbManager.executeSync(query.str().c_str(), &records); - _D("delete old visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); -} - -ctx::PlacesDetector::PlacesDetector(bool testMode) : - __testMode(testMode) -{ - if (testMode) { - return; - } - __dbCreateTable(); - std::vector records = __dbGetPlaces(); - std::vector> dbPlaces = __placesFromJsons(records); - __detectedPlacesUpdate(dbPlaces); -} - -void ctx::PlacesDetector::__dbCreateTable() -{ - bool ret = __dbManager.createTable(0, PLACE_TABLE, __PLACE_TABLE_COLUMNS); - _D("db: place Table Creation Result: %s", ret ? "SUCCESS" : "FAIL"); -} - -void ctx::PlacesDetector::__dbInsertPlace(const Place &place) -{ - Json data; - data.set(NULL, PLACE_COLUMN_CATEG_ID, place.categId); - data.set(NULL, PLACE_COLUMN_CATEG_CONFIDENCE, place.categConfidence); - data.set(NULL, PLACE_COLUMN_NAME, place.name); - - data.set(NULL, PLACE_COLUMN_LOCATION_VALID, place.locationValid); - data.set(NULL, PLACE_COLUMN_LOCATION_LATITUDE, place.location.latitude); - data.set(NULL, PLACE_COLUMN_LOCATION_LONGITUDE, place.location.longitude); - - data.set(NULL, PLACE_COLUMN_WIFI_APS, place.wifiAps); - data.set(NULL, PLACE_COLUMN_CREATE_DATE, static_cast(place.createDate)); - - int64_t rowId; - bool ret = __dbManager.insertSync(PLACE_TABLE, data, &rowId); - _D("insert place execute query result: %s", ret ? "SUCCESS" : "FAIL"); -} - -std::vector> ctx::PlacesDetector::getPlaces() -{ - // XXX: In case of thread safety issues use std::mutex to protect places list. - return __detectedPlaces; -} diff --git a/src/place/recognition/user_places/places_detector.h b/src/place/recognition/user_places/places_detector.h deleted file mode 100644 index 6444539..0000000 --- a/src/place/recognition/user_places/places_detector.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_PLACES_DETECTOR_ -#define _CONTEXT_PLACE_RECOGNITION_PLACES_DETECTOR_ - -#include -#include -#include -#include -#include "visit_detector.h" -#include "user_places_types.h" - -namespace ctx { - - class PlacesDetector : public ITimerListener { - - private: - bool __testMode; - DatabaseManager __dbManager; - - double __doubleValueFromJson(Json &row, const char* key); - Categs __visitCategsFromJson(Json &row); - Visit __visitFromJson(Json &row); - Visits __visitsFromJsons(std::vector& records); - std::shared_ptr __placeFromJson(Json &row); - std::vector> __placesFromJsons(std::vector& records); - - std::shared_ptr __graphFromVisits(const std::vector &visits); - - void __dbCreateTable(); - void __dbDeletePlaces(); - void __dbDeleteOldVisits(); - void __dbDeleteOlderVisitsThan(time_t threshold); - std::vector __dbGetVisits(); - std::vector __dbGetPlaces(); - void __dbInsertPlace(const Place &place); - - std::shared_ptr __placeFromMergedVisits(Visits &mergedVisits); - std::vector> __detectedPlaces; - void __detectedPlacesUpdate(std::vector> &newPlaces); - void __processVisits(Visits &visits); - static void __mergeLocation(const Visits &mergedVisits, Place &place); - std::shared_ptr __mergeVisits(const std::vector &visits); - - bool onTimerExpired(int timerId); - - public: - PlacesDetector(bool testMode = false); - static void reduceOutliers(Visits &visits); // TODO: move to private - static void reduceOutliers(std::shared_ptr &cc); // TODO: move to private - std::vector> getPlaces(); - - }; /* class PlacesDetector */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_PLACES_DETECTOR_ */ diff --git a/src/place/recognition/user_places/prob_features_model.h b/src/place/recognition/user_places/prob_features_model.h deleted file mode 100644 index d30f548..0000000 --- a/src/place/recognition/user_places/prob_features_model.h +++ /dev/null @@ -1,30291 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_FEATURES_MODEL_H_ -#define _CONTEXT_PLACE_RECOGNITION_FEATURES_MODEL_H_ - -namespace ctx { - -namespace prob_features { - - /* - * Probabilities for whole week with minutes resolution - * from beginning of the week (sunday -> monday midnight) <0, 10080). - * Key is PlaceCategId: - * PLACE_CATEG_ID_HOME - * PLACE_CATEG_ID_WORK - * PLACE_CATEG_ID_OTHER - */ - std::map> weekModel { - { PLACE_CATEG_ID_HOME, - { - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9833333333333330, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9830508474576270, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9827586206896550, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9821428571428570, - 0.9821428571428570, - 0.9821428571428570, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770, - 0.9821428571428570, - 0.9821428571428570, - 0.9821428571428570, - 0.9821428571428570, - 0.9821428571428570, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9636363636363640, - 0.9636363636363640, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9629629629629630, - 0.9629629629629630, - 0.9629629629629630, - 0.9629629629629630, - 0.9629629629629630, - 0.9629629629629630, - 0.9454545454545450, - 0.9454545454545450, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9122807017543860, - 0.9122807017543860, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9245283018867930, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9215686274509800, - 0.9215686274509800, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8490566037735850, - 0.8490566037735850, - 0.8490566037735850, - 0.8490566037735850, - 0.8461538461538460, - 0.8461538461538460, - 0.8461538461538460, - 0.8461538461538460, - 0.8461538461538460, - 0.8461538461538460, - 0.8461538461538460, - 0.8148148148148150, - 0.8148148148148150, - 0.8148148148148150, - 0.8148148148148150, - 0.8148148148148150, - 0.8113207547169810, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7924528301886790, - 0.7924528301886790, - 0.7924528301886790, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7692307692307690, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7169811320754720, - 0.7169811320754720, - 0.7169811320754720, - 0.7115384615384620, - 0.7000000000000000, - 0.7000000000000000, - 0.6875000000000000, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6666666666666670, - 0.6400000000000000, - 0.6274509803921570, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6078431372549020, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.5882352941176470, - 0.5882352941176470, - 0.5882352941176470, - 0.5882352941176470, - 0.5882352941176470, - 0.5769230769230770, - 0.5769230769230770, - 0.5600000000000000, - 0.5490196078431370, - 0.5208333333333330, - 0.5208333333333330, - 0.5208333333333330, - 0.5208333333333330, - 0.5208333333333330, - 0.5102040816326530, - 0.4893617021276600, - 0.4893617021276600, - 0.4893617021276600, - 0.4893617021276600, - 0.4444444444444440, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4255319148936170, - 0.4130434782608700, - 0.4130434782608700, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3478260869565220, - 0.3478260869565220, - 0.3478260869565220, - 0.3478260869565220, - 0.3478260869565220, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3111111111111110, - 0.3111111111111110, - 0.2790697674418600, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2666666666666670, - 0.2666666666666670, - 0.2666666666666670, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2244897959183670, - 0.2244897959183670, - 0.2200000000000000, - 0.2156862745098040, - 0.2156862745098040, - 0.2156862745098040, - 0.2075471698113210, - 0.2075471698113210, - 0.1923076923076920, - 0.1923076923076920, - 0.1886792452830190, - 0.1886792452830190, - 0.1886792452830190, - 0.1886792452830190, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1481481481481480, - 0.1481481481481480, - 0.1428571428571430, - 0.1428571428571430, - 0.1379310344827590, - 0.1379310344827590, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1034482758620690, - 0.1034482758620690, - 0.1000000000000000, - 0.1000000000000000, - 0.0983606557377049, - 0.0983606557377049, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0677966101694915, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0833333333333333, - 0.0833333333333333, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0847457627118644, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0819672131147541, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0862068965517241, - 0.0862068965517241, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.1034482758620690, - 0.1034482758620690, - 0.1034482758620690, - 0.1052631578947370, - 0.1052631578947370, - 0.1052631578947370, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1090909090909090, - 0.1090909090909090, - 0.1111111111111110, - 0.1111111111111110, - 0.1090909090909090, - 0.1111111111111110, - 0.1090909090909090, - 0.1111111111111110, - 0.1132075471698110, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1320754716981130, - 0.1320754716981130, - 0.1346153846153850, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1481481481481480, - 0.1636363636363640, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1578947368421050, - 0.1724137931034480, - 0.1724137931034480, - 0.1754385964912280, - 0.1785714285714290, - 0.1785714285714290, - 0.1818181818181820, - 0.1851851851851850, - 0.1851851851851850, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1785714285714290, - 0.1851851851851850, - 0.1851851851851850, - 0.1818181818181820, - 0.1964285714285710, - 0.1818181818181820, - 0.1818181818181820, - 0.1964285714285710, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.2105263157894740, - 0.2142857142857140, - 0.2321428571428570, - 0.2280701754385960, - 0.2280701754385960, - 0.2321428571428570, - 0.2321428571428570, - 0.2500000000000000, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2500000000000000, - 0.2500000000000000, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2592592592592590, - 0.2545454545454540, - 0.2545454545454540, - 0.2592592592592590, - 0.2592592592592590, - 0.2592592592592590, - 0.2777777777777780, - 0.2777777777777780, - 0.2641509433962260, - 0.2692307692307690, - 0.2692307692307690, - 0.2745098039215690, - 0.2830188679245280, - 0.2884615384615380, - 0.2941176470588230, - 0.2941176470588230, - 0.2941176470588230, - 0.2884615384615380, - 0.2941176470588230, - 0.2884615384615380, - 0.2884615384615380, - 0.3000000000000000, - 0.3061224489795920, - 0.3061224489795920, - 0.3061224489795920, - 0.3061224489795920, - 0.3000000000000000, - 0.3061224489795920, - 0.3061224489795920, - 0.3061224489795920, - 0.3265306122448980, - 0.3265306122448980, - 0.3200000000000000, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3478260869565220, - 0.3695652173913040, - 0.3695652173913040, - 0.3695652173913040, - 0.4130434782608700, - 0.4130434782608700, - 0.4255319148936170, - 0.4255319148936170, - 0.4255319148936170, - 0.4489795918367350, - 0.4888888888888890, - 0.5000000000000000, - 0.5000000000000000, - 0.5000000000000000, - 0.5000000000000000, - 0.5116279069767440, - 0.5116279069767440, - 0.5116279069767440, - 0.5238095238095240, - 0.5238095238095240, - 0.5365853658536590, - 0.5365853658536590, - 0.5348837209302320, - 0.5348837209302320, - 0.5227272727272730, - 0.5348837209302320, - 0.5348837209302320, - 0.5348837209302320, - 0.5227272727272730, - 0.5227272727272730, - 0.5000000000000000, - 0.5000000000000000, - 0.5111111111111110, - 0.5111111111111110, - 0.5227272727272730, - 0.5227272727272730, - 0.4893617021276600, - 0.5000000000000000, - 0.5102040816326530, - 0.5102040816326530, - 0.5200000000000000, - 0.5306122448979590, - 0.5200000000000000, - 0.5294117647058820, - 0.5294117647058820, - 0.5294117647058820, - 0.5192307692307690, - 0.5094339622641510, - 0.5094339622641510, - 0.5094339622641510, - 0.5294117647058820, - 0.5384615384615380, - 0.5471698113207550, - 0.5471698113207550, - 0.5471698113207550, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5636363636363640, - 0.5535714285714290, - 0.5535714285714290, - 0.5535714285714290, - 0.5636363636363640, - 0.5714285714285710, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5925925925925930, - 0.5925925925925930, - 0.5925925925925930, - 0.5925925925925930, - 0.5818181818181820, - 0.5925925925925930, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6956521739130430, - 0.7111111111111110, - 0.7111111111111110, - 0.7111111111111110, - 0.7272727272727270, - 0.7272727272727270, - 0.7333333333333330, - 0.7333333333333330, - 0.7333333333333330, - 0.7333333333333330, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7826086956521740, - 0.7826086956521740, - 0.7826086956521740, - 0.7872340425531920, - 0.7872340425531920, - 0.7872340425531920, - 0.7708333333333330, - 0.7400000000000000, - 0.7400000000000000, - 0.7551020408163260, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7200000000000000, - 0.7200000000000000, - 0.7200000000000000, - 0.7058823529411760, - 0.7058823529411760, - 0.7115384615384620, - 0.7115384615384620, - 0.7115384615384620, - 0.7169811320754720, - 0.7169811320754720, - 0.7307692307692310, - 0.7307692307692310, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7600000000000000, - 0.7600000000000000, - 0.7647058823529410, - 0.7647058823529410, - 0.7500000000000000, - 0.7500000000000000, - 0.7800000000000000, - 0.7800000000000000, - 0.7692307692307690, - 0.7647058823529410, - 0.7647058823529410, - 0.7800000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8200000000000000, - 0.8200000000000000, - 0.8039215686274510, - 0.8039215686274510, - 0.8039215686274510, - 0.8039215686274510, - 0.8235294117647060, - 0.8076923076923080, - 0.7924528301886790, - 0.7924528301886790, - 0.7924528301886790, - 0.7884615384615380, - 0.8076923076923080, - 0.8076923076923080, - 0.8076923076923080, - 0.8113207547169810, - 0.8113207547169810, - 0.8148148148148150, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8148148148148150, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8333333333333330, - 0.8518518518518520, - 0.8545454545454550, - 0.8545454545454550, - 0.8571428571428570, - 0.8571428571428570, - 0.8596491228070170, - 0.8596491228070170, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8500000000000000, - 0.8500000000000000, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8793103448275860, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8620689655172410, - 0.8620689655172410, - 0.8771929824561400, - 0.8793103448275860, - 0.8813559322033900, - 0.8813559322033900, - 0.8965517241379310, - 0.8965517241379310, - 0.8965517241379310, - 0.8965517241379310, - 0.8965517241379310, - 0.8965517241379310, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8793103448275860, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.9000000000000000, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9137931034482760, - 0.9137931034482760, - 0.9137931034482760, - 0.9137931034482760, - 0.9137931034482760, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9016393442622950, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9062500000000000, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9354838709677420, - 0.9354838709677420, - 0.9354838709677420, - 0.9508196721311470, - 0.9508196721311470, - 0.9508196721311470, - 0.9508196721311470, - 0.9516129032258060, - 0.9516129032258060, - 0.9523809523809520, - 0.9523809523809520, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9836065573770490, - 0.9836065573770490, - 0.9836065573770490, - 0.9836065573770490, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9838709677419350, - 0.9841269841269840, - 0.9841269841269840, - 0.9841269841269840, - 0.9841269841269840, - 0.9841269841269840, - 0.9841269841269840, - 0.9843750000000000, - 0.9843750000000000, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9848484848484850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9846153846153850, - 0.9843750000000000, - 0.9843750000000000, - 0.9843750000000000, - 0.9843750000000000, - 0.9843750000000000, - 0.9843750000000000, - 0.9843750000000000, - 0.9843750000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 1.0000000000000000, - 0.9661016949152540, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9473684210526320, - 0.9298245614035090, - 0.9298245614035090, - 0.9298245614035090, - 0.9298245614035090, - 0.9298245614035090, - 0.9298245614035090, - 0.9298245614035090, - 0.9137931034482760, - 0.9122807017543860, - 0.9122807017543860, - 0.9122807017543860, - 0.9122807017543860, - 0.9107142857142860, - 0.9272727272727270, - 0.9107142857142860, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.8947368421052630, - 0.9107142857142860, - 0.9107142857142860, - 0.9107142857142860, - 0.9107142857142860, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8727272727272730, - 0.8888888888888890, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8490566037735850, - 0.8490566037735850, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8000000000000000, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7818181818181820, - 0.7777777777777780, - 0.7454545454545450, - 0.7454545454545450, - 0.7407407407407410, - 0.7407407407407410, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7307692307692310, - 0.7254901960784310, - 0.7254901960784310, - 0.7254901960784310, - 0.7254901960784310, - 0.7058823529411760, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.6800000000000000, - 0.6800000000000000, - 0.6666666666666670, - 0.6666666666666670, - 0.6600000000000000, - 0.6600000000000000, - 0.6600000000000000, - 0.6470588235294120, - 0.6346153846153850, - 0.6037735849056600, - 0.6037735849056600, - 0.5961538461538460, - 0.5769230769230770, - 0.5576923076923080, - 0.5576923076923080, - 0.5576923076923080, - 0.5471698113207550, - 0.5471698113207550, - 0.5471698113207550, - 0.5471698113207550, - 0.5471698113207550, - 0.5471698113207550, - 0.5294117647058820, - 0.5294117647058820, - 0.5294117647058820, - 0.5294117647058820, - 0.5200000000000000, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5200000000000000, - 0.5200000000000000, - 0.5200000000000000, - 0.5200000000000000, - 0.5200000000000000, - 0.5200000000000000, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5000000000000000, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.4509803921568630, - 0.4600000000000000, - 0.4285714285714290, - 0.4285714285714290, - 0.4285714285714290, - 0.4285714285714290, - 0.3958333333333330, - 0.3958333333333330, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3541666666666670, - 0.3333333333333330, - 0.3265306122448980, - 0.3265306122448980, - 0.3061224489795920, - 0.3000000000000000, - 0.2941176470588230, - 0.2941176470588230, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2340425531914890, - 0.2340425531914890, - 0.2391304347826090, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2045454545454550, - 0.1956521739130430, - 0.1914893617021280, - 0.1875000000000000, - 0.1632653061224490, - 0.1632653061224490, - 0.1600000000000000, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1403508771929820, - 0.1403508771929820, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1166666666666670, - 0.1166666666666670, - 0.1166666666666670, - 0.1166666666666670, - 0.1166666666666670, - 0.1166666666666670, - 0.1147540983606560, - 0.1147540983606560, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.0967741935483871, - 0.0967741935483871, - 0.1093750000000000, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0769230769230769, - 0.0769230769230769, - 0.0781250000000000, - 0.0781250000000000, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0491803278688525, - 0.0491803278688525, - 0.0500000000000000, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0476190476190476, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0468750000000000, - 0.0476190476190476, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0476190476190476, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0333333333333333, - 0.0344827586206897, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0357142857142857, - 0.0363636363636364, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0363636363636364, - 0.0370370370370370, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0317460317460317, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0937500000000000, - 0.0952380952380952, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.1000000000000000, - 0.1147540983606560, - 0.1147540983606560, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1311475409836070, - 0.1333333333333330, - 0.1355932203389830, - 0.1355932203389830, - 0.1333333333333330, - 0.1333333333333330, - 0.1290322580645160, - 0.1269841269841270, - 0.1406250000000000, - 0.1538461538461540, - 0.1538461538461540, - 0.1538461538461540, - 0.1538461538461540, - 0.1562500000000000, - 0.1538461538461540, - 0.1538461538461540, - 0.1538461538461540, - 0.1538461538461540, - 0.1562500000000000, - 0.1562500000000000, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1562500000000000, - 0.1562500000000000, - 0.1562500000000000, - 0.1562500000000000, - 0.1562500000000000, - 0.1718750000000000, - 0.1718750000000000, - 0.1718750000000000, - 0.1718750000000000, - 0.1718750000000000, - 0.1718750000000000, - 0.1718750000000000, - 0.1846153846153850, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1904761904761900, - 0.1774193548387100, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1864406779661020, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1929824561403510, - 0.2000000000000000, - 0.1964285714285710, - 0.1964285714285710, - 0.2000000000000000, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2115384615384620, - 0.2222222222222220, - 0.2222222222222220, - 0.2181818181818180, - 0.2181818181818180, - 0.2142857142857140, - 0.2142857142857140, - 0.2142857142857140, - 0.2241379310344830, - 0.2241379310344830, - 0.2280701754385960, - 0.2321428571428570, - 0.2363636363636360, - 0.2321428571428570, - 0.2321428571428570, - 0.2321428571428570, - 0.2321428571428570, - 0.2407407407407410, - 0.2592592592592590, - 0.2745098039215690, - 0.2745098039215690, - 0.2884615384615380, - 0.3000000000000000, - 0.3265306122448980, - 0.3265306122448980, - 0.3400000000000000, - 0.3400000000000000, - 0.3400000000000000, - 0.3400000000000000, - 0.3333333333333330, - 0.3333333333333330, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3541666666666670, - 0.3541666666666670, - 0.3400000000000000, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3653846153846150, - 0.3888888888888890, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4181818181818180, - 0.4181818181818180, - 0.4181818181818180, - 0.4385964912280700, - 0.4285714285714290, - 0.4285714285714290, - 0.4285714285714290, - 0.4285714285714290, - 0.4285714285714290, - 0.4464285714285710, - 0.4545454545454550, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4705882352941180, - 0.5000000000000000, - 0.5098039215686270, - 0.5098039215686270, - 0.5192307692307690, - 0.5098039215686270, - 0.5098039215686270, - 0.5098039215686270, - 0.5000000000000000, - 0.5000000000000000, - 0.4905660377358490, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.4727272727272730, - 0.4727272727272730, - 0.4727272727272730, - 0.4727272727272730, - 0.4727272727272730, - 0.4807692307692310, - 0.4807692307692310, - 0.4807692307692310, - 0.4905660377358490, - 0.5000000000000000, - 0.5000000000000000, - 0.4909090909090910, - 0.4909090909090910, - 0.5192307692307690, - 0.5370370370370370, - 0.5370370370370370, - 0.5370370370370370, - 0.5576923076923080, - 0.5576923076923080, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.6170212765957450, - 0.6304347826086960, - 0.6304347826086960, - 0.6666666666666670, - 0.6739130434782610, - 0.6808510638297870, - 0.6458333333333330, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6458333333333330, - 0.6458333333333330, - 0.6530612244897960, - 0.6666666666666670, - 0.6666666666666670, - 0.6875000000000000, - 0.6938775510204080, - 0.7083333333333330, - 0.7234042553191490, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.6938775510204080, - 0.6938775510204080, - 0.7000000000000000, - 0.7000000000000000, - 0.7058823529411760, - 0.7058823529411760, - 0.6923076923076920, - 0.6923076923076920, - 0.6981132075471700, - 0.7169811320754720, - 0.7500000000000000, - 0.7500000000000000, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7358490566037730, - 0.7407407407407410, - 0.7547169811320760, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7272727272727270, - 0.7454545454545450, - 0.7321428571428570, - 0.7321428571428570, - 0.7321428571428570, - 0.7321428571428570, - 0.7368421052631580, - 0.7368421052631580, - 0.7241379310344830, - 0.7241379310344830, - 0.7241379310344830, - 0.7241379310344830, - 0.7288135593220340, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7333333333333330, - 0.7333333333333330, - 0.7333333333333330, - 0.7213114754098360, - 0.7258064516129030, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7419354838709680, - 0.7419354838709680, - 0.7419354838709680, - 0.7666666666666670, - 0.7666666666666670, - 0.7666666666666670, - 0.7666666666666670, - 0.7666666666666670, - 0.7796610169491530, - 0.8214285714285710, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.7758620689655170, - 0.7758620689655170, - 0.7796610169491530, - 0.7833333333333330, - 0.7868852459016390, - 0.8000000000000000, - 0.7868852459016390, - 0.7868852459016390, - 0.7868852459016390, - 0.7903225806451610, - 0.7903225806451610, - 0.7903225806451610, - 0.7903225806451610, - 0.8032786885245900, - 0.8032786885245900, - 0.7903225806451610, - 0.7903225806451610, - 0.7936507936507940, - 0.7846153846153850, - 0.7846153846153850, - 0.7846153846153850, - 0.7846153846153850, - 0.7968750000000000, - 0.7968750000000000, - 0.7968750000000000, - 0.7846153846153850, - 0.7846153846153850, - 0.7846153846153850, - 0.7846153846153850, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8125000000000000, - 0.8225806451612900, - 0.8225806451612900, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8793103448275860, - 0.8793103448275860, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8906250000000000, - 0.8906250000000000, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8730158730158730, - 0.8888888888888890, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9193548387096770, - 0.9193548387096770, - 0.9193548387096770, - 0.9193548387096770, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9354838709677420, - 0.9354838709677420, - 0.9354838709677420, - 0.9354838709677420, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9354838709677420, - 0.9354838709677420, - 0.9354838709677420, - 0.9354838709677420, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9230769230769230, - 0.9230769230769230, - 0.9230769230769230, - 0.9230769230769230, - 0.9230769230769230, - 0.9230769230769230, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9242424242424240, - 0.9253731343283580, - 0.9264705882352940, - 0.9264705882352940, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9285714285714290, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9420289855072460, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9565217391304350, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9705882352941180, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9701492537313430, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9696969696969700, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9692307692307690, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9692307692307690, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9365079365079360, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9193548387096770, - 0.9193548387096770, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9333333333333330, - 0.9322033898305080, - 0.9322033898305080, - 0.9322033898305080, - 0.9322033898305080, - 0.9166666666666670, - 0.9322033898305080, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8852459016393440, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8793103448275860, - 0.8793103448275860, - 0.8793103448275860, - 0.8793103448275860, - 0.8793103448275860, - 0.8644067796610170, - 0.8666666666666670, - 0.8524590163934430, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8474576271186440, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8166666666666670, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8000000000000000, - 0.7857142857142860, - 0.7857142857142860, - 0.7857142857142860, - 0.7857142857142860, - 0.7636363636363640, - 0.7592592592592590, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7500000000000000, - 0.7450980392156860, - 0.7346938775510200, - 0.7200000000000000, - 0.7200000000000000, - 0.7058823529411760, - 0.7000000000000000, - 0.6862745098039220, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6538461538461540, - 0.6470588235294120, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6226415094339620, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.5818181818181820, - 0.5818181818181820, - 0.5818181818181820, - 0.5714285714285710, - 0.5714285714285710, - 0.5614035087719300, - 0.5517241379310340, - 0.5272727272727270, - 0.5272727272727270, - 0.5272727272727270, - 0.5272727272727270, - 0.5178571428571430, - 0.5178571428571430, - 0.4909090909090910, - 0.4821428571428570, - 0.4821428571428570, - 0.4736842105263160, - 0.4482758620689660, - 0.4482758620689660, - 0.4385964912280700, - 0.4385964912280700, - 0.4385964912280700, - 0.4385964912280700, - 0.4385964912280700, - 0.4385964912280700, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3888888888888890, - 0.3818181818181820, - 0.3818181818181820, - 0.3703703703703700, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3518518518518520, - 0.3137254901960780, - 0.2941176470588230, - 0.2800000000000000, - 0.2653061224489800, - 0.2653061224489800, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2200000000000000, - 0.2156862745098040, - 0.2156862745098040, - 0.2156862745098040, - 0.2115384615384620, - 0.2115384615384620, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.1886792452830190, - 0.1886792452830190, - 0.1886792452830190, - 0.1886792452830190, - 0.1851851851851850, - 0.1851851851851850, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1694915254237290, - 0.1694915254237290, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1612903225806450, - 0.1406250000000000, - 0.1406250000000000, - 0.1384615384615380, - 0.1384615384615380, - 0.1406250000000000, - 0.1406250000000000, - 0.1384615384615380, - 0.1384615384615380, - 0.1363636363636360, - 0.1363636363636360, - 0.1363636363636360, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1323529411764710, - 0.1304347826086960, - 0.1304347826086960, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1285714285714290, - 0.1267605633802820, - 0.1142857142857140, - 0.1142857142857140, - 0.1159420289855070, - 0.1159420289855070, - 0.1159420289855070, - 0.1029411764705880, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0869565217391304, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0857142857142857, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0735294117647059, - 0.0724637681159420, - 0.0735294117647059, - 0.0746268656716418, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0781250000000000, - 0.0769230769230769, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0769230769230769, - 0.0781250000000000, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0625000000000000, - 0.0625000000000000, - 0.0615384615384615, - 0.0615384615384615, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0645161290322581, - 0.0634920634920635, - 0.0634920634920635, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0645161290322581, - 0.0645161290322581, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0645161290322581, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0606060606060606, - 0.0579710144927536, - 0.0579710144927536, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0563380281690141, - 0.0563380281690141, - 0.0571428571428571, - 0.0579710144927536, - 0.0588235294117647, - 0.0588235294117647, - 0.0597014925373134, - 0.0606060606060606, - 0.0597014925373134, - 0.0588235294117647, - 0.0579710144927536, - 0.0571428571428571, - 0.0571428571428571, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0735294117647059, - 0.0735294117647059, - 0.0746268656716418, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0724637681159420, - 0.0724637681159420, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0704225352112676, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0684931506849315, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0694444444444444, - 0.0694444444444444, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0555555555555556, - 0.0555555555555556, - 0.0563380281690141, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0422535211267606, - 0.0428571428571429, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0428571428571429, - 0.0434782608695652, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0735294117647059, - 0.0735294117647059, - 0.0724637681159420, - 0.0735294117647059, - 0.0724637681159420, - 0.0857142857142857, - 0.0857142857142857, - 0.0985915492957746, - 0.0985915492957746, - 0.1000000000000000, - 0.1014492753623190, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1194029850746270, - 0.1194029850746270, - 0.1194029850746270, - 0.1194029850746270, - 0.1194029850746270, - 0.1194029850746270, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1470588235294120, - 0.1449275362318840, - 0.1449275362318840, - 0.1449275362318840, - 0.1470588235294120, - 0.1470588235294120, - 0.1449275362318840, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1323529411764710, - 0.1343283582089550, - 0.1212121212121210, - 0.1194029850746270, - 0.1194029850746270, - 0.1212121212121210, - 0.1194029850746270, - 0.1194029850746270, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1470588235294120, - 0.1492537313432840, - 0.1515151515151520, - 0.1515151515151520, - 0.1515151515151520, - 0.1515151515151520, - 0.1515151515151520, - 0.1538461538461540, - 0.1538461538461540, - 0.1666666666666670, - 0.1666666666666670, - 0.1791044776119400, - 0.1791044776119400, - 0.1818181818181820, - 0.1875000000000000, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1774193548387100, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1666666666666670, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1833333333333330, - 0.1833333333333330, - 0.2131147540983610, - 0.2166666666666670, - 0.2166666666666670, - 0.2131147540983610, - 0.2258064516129030, - 0.2258064516129030, - 0.2258064516129030, - 0.2258064516129030, - 0.2258064516129030, - 0.2295081967213110, - 0.2295081967213110, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2372881355932200, - 0.2456140350877190, - 0.2363636363636360, - 0.2631578947368420, - 0.2631578947368420, - 0.2586206896551720, - 0.2631578947368420, - 0.2631578947368420, - 0.2678571428571430, - 0.2727272727272730, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2909090909090910, - 0.2962962962962960, - 0.2830188679245280, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3750000000000000, - 0.3750000000000000, - 0.3750000000000000, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3877551020408160, - 0.3958333333333330, - 0.3958333333333330, - 0.4081632653061220, - 0.4038461538461540, - 0.4074074074074070, - 0.4035087719298250, - 0.3965517241379310, - 0.3965517241379310, - 0.4067796610169490, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4237288135593220, - 0.4237288135593220, - 0.4237288135593220, - 0.4310344827586210, - 0.4310344827586210, - 0.4237288135593220, - 0.4237288135593220, - 0.4237288135593220, - 0.4333333333333330, - 0.4426229508196720, - 0.4426229508196720, - 0.4516129032258060, - 0.4516129032258060, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4531250000000000, - 0.4461538461538460, - 0.4461538461538460, - 0.4285714285714290, - 0.4354838709677420, - 0.4262295081967210, - 0.4482758620689660, - 0.4482758620689660, - 0.4406779661016950, - 0.4406779661016950, - 0.4406779661016950, - 0.4576271186440680, - 0.4590163934426230, - 0.4677419354838710, - 0.4915254237288140, - 0.4915254237288140, - 0.4915254237288140, - 0.5000000000000000, - 0.5081967213114750, - 0.5081967213114750, - 0.5081967213114750, - 0.5081967213114750, - 0.5166666666666670, - 0.5166666666666670, - 0.5166666666666670, - 0.5166666666666670, - 0.5081967213114750, - 0.5081967213114750, - 0.5081967213114750, - 0.5000000000000000, - 0.5084745762711860, - 0.5084745762711860, - 0.5000000000000000, - 0.5000000000000000, - 0.5081967213114750, - 0.5161290322580650, - 0.5076923076923080, - 0.5156250000000000, - 0.5238095238095240, - 0.5238095238095240, - 0.5238095238095240, - 0.5245901639344260, - 0.5333333333333330, - 0.5245901639344260, - 0.5500000000000000, - 0.5500000000000000, - 0.5573770491803280, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5645161290322580, - 0.5625000000000000, - 0.5538461538461540, - 0.5454545454545450, - 0.5454545454545450, - 0.5454545454545450, - 0.5454545454545450, - 0.5384615384615380, - 0.5384615384615380, - 0.5384615384615380, - 0.5454545454545450, - 0.5588235294117650, - 0.5588235294117650, - 0.5671641791044780, - 0.5588235294117650, - 0.5588235294117650, - 0.5588235294117650, - 0.5757575757575760, - 0.5757575757575760, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6290322580645160, - 0.6290322580645160, - 0.6290322580645160, - 0.6393442622950820, - 0.6393442622950820, - 0.6393442622950820, - 0.6271186440677970, - 0.6271186440677970, - 0.6271186440677970, - 0.6206896551724140, - 0.6206896551724140, - 0.6206896551724140, - 0.6428571428571430, - 0.6428571428571430, - 0.6315789473684210, - 0.6428571428571430, - 0.6428571428571430, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6481481481481480, - 0.6481481481481480, - 0.6296296296296300, - 0.6296296296296300, - 0.6415094339622640, - 0.6296296296296300, - 0.6415094339622640, - 0.6226415094339620, - 0.6181818181818180, - 0.6296296296296300, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6315789473684210, - 0.6428571428571430, - 0.6545454545454550, - 0.6607142857142860, - 0.6607142857142860, - 0.6607142857142860, - 0.6724137931034480, - 0.6724137931034480, - 0.6779661016949150, - 0.6779661016949150, - 0.6833333333333330, - 0.6833333333333330, - 0.7000000000000000, - 0.7000000000000000, - 0.7166666666666670, - 0.7166666666666670, - 0.7118644067796610, - 0.7118644067796610, - 0.7241379310344830, - 0.7241379310344830, - 0.7368421052631580, - 0.7368421052631580, - 0.7368421052631580, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7166666666666670, - 0.7049180327868850, - 0.7049180327868850, - 0.7049180327868850, - 0.7049180327868850, - 0.6935483870967740, - 0.6935483870967740, - 0.6935483870967740, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.6923076923076920, - 0.6923076923076920, - 0.6969696969696970, - 0.6969696969696970, - 0.7076923076923080, - 0.7076923076923080, - 0.6969696969696970, - 0.6969696969696970, - 0.6865671641791040, - 0.6865671641791040, - 0.6865671641791040, - 0.6911764705882350, - 0.6911764705882350, - 0.6911764705882350, - 0.6911764705882350, - 0.7014925373134330, - 0.7058823529411760, - 0.7058823529411760, - 0.7164179104477610, - 0.7164179104477610, - 0.7164179104477610, - 0.7164179104477610, - 0.7164179104477610, - 0.7164179104477610, - 0.7246376811594200, - 0.7246376811594200, - 0.7352941176470590, - 0.7352941176470590, - 0.7352941176470590, - 0.7352941176470590, - 0.7352941176470590, - 0.7352941176470590, - 0.7352941176470590, - 0.7462686567164180, - 0.7462686567164180, - 0.7575757575757580, - 0.7611940298507460, - 0.7611940298507460, - 0.7647058823529410, - 0.7681159420289850, - 0.7681159420289850, - 0.7681159420289850, - 0.7681159420289850, - 0.7681159420289850, - 0.7681159420289850, - 0.7826086956521740, - 0.7941176470588230, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8059701492537310, - 0.8181818181818180, - 0.8307692307692310, - 0.8307692307692310, - 0.8437500000000000, - 0.8437500000000000, - 0.8437500000000000, - 0.8461538461538460, - 0.8461538461538460, - 0.8484848484848480, - 0.8484848484848480, - 0.8484848484848480, - 0.8484848484848480, - 0.8507462686567160, - 0.8571428571428570, - 0.8571428571428570, - 0.8695652173913040, - 0.8695652173913040, - 0.8695652173913040, - 0.8695652173913040, - 0.8695652173913040, - 0.8695652173913040, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8656716417910450, - 0.8636363636363640, - 0.8636363636363640, - 0.8636363636363640, - 0.8636363636363640, - 0.8636363636363640, - 0.8636363636363640, - 0.8656716417910450, - 0.8656716417910450, - 0.8695652173913040, - 0.8695652173913040, - 0.8695652173913040, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8636363636363640, - 0.8636363636363640, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8769230769230770, - 0.8906250000000000, - 0.8906250000000000, - 0.8906250000000000, - 0.8923076923076920, - 0.8923076923076920, - 0.8923076923076920, - 0.8923076923076920, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.9000000000000000, - 0.9000000000000000, - 0.9014084507042250, - 0.9014084507042250, - 0.9014084507042250, - 0.9014084507042250, - 0.9014084507042250, - 0.9014084507042250, - 0.9014084507042250, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9305555555555560, - 0.9305555555555560, - 0.9305555555555560, - 0.9305555555555560, - 0.9305555555555560, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9315068493150680, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9324324324324320, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9459459459459460, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9452054794520550, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9444444444444440, - 0.9577464788732390, - 0.9577464788732390, - 0.9577464788732390, - 0.9577464788732390, - 0.9577464788732390, - 0.9577464788732390, - 0.9577464788732390, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9571428571428570, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9558823529411760, - 0.9545454545454550, - 0.9545454545454550, - 0.9545454545454550, - 0.9545454545454550, - 0.9538461538461540, - 0.9538461538461540, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9672131147540980, - 0.9672131147540980, - 0.9672131147540980, - 0.9672131147540980, - 0.9672131147540980, - 0.9672131147540980, - 0.9666666666666670, - 0.9661016949152540, - 0.9661016949152540, - 0.9655172413793100, - 0.9655172413793100, - 0.9655172413793100, - 0.9491525423728810, - 0.9491525423728810, - 0.9491525423728810, - 0.9333333333333330, - 0.9333333333333330, - 0.9322033898305080, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9137931034482760, - 0.9137931034482760, - 0.9137931034482760, - 0.8983050847457630, - 0.8983050847457630, - 0.8965517241379310, - 0.8813559322033900, - 0.8813559322033900, - 0.8793103448275860, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8474576271186440, - 0.8474576271186440, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.7868852459016390, - 0.7868852459016390, - 0.7868852459016390, - 0.7833333333333330, - 0.7833333333333330, - 0.7833333333333330, - 0.7833333333333330, - 0.7704918032786880, - 0.7704918032786880, - 0.7704918032786880, - 0.7704918032786880, - 0.7704918032786880, - 0.7580645161290320, - 0.7540983606557380, - 0.7419354838709680, - 0.7377049180327870, - 0.7377049180327870, - 0.7288135593220340, - 0.7118644067796610, - 0.7118644067796610, - 0.7068965517241380, - 0.7068965517241380, - 0.7017543859649120, - 0.6964285714285710, - 0.6964285714285710, - 0.6842105263157900, - 0.6842105263157900, - 0.6842105263157900, - 0.6842105263157900, - 0.6785714285714290, - 0.6785714285714290, - 0.6785714285714290, - 0.6785714285714290, - 0.6785714285714290, - 0.6666666666666670, - 0.6551724137931030, - 0.6379310344827590, - 0.6271186440677970, - 0.6206896551724140, - 0.5964912280701750, - 0.5964912280701750, - 0.5789473684210530, - 0.5689655172413790, - 0.5689655172413790, - 0.5689655172413790, - 0.5689655172413790, - 0.5689655172413790, - 0.5593220338983050, - 0.5593220338983050, - 0.5593220338983050, - 0.5593220338983050, - 0.5500000000000000, - 0.5423728813559320, - 0.5333333333333330, - 0.5333333333333330, - 0.5333333333333330, - 0.5333333333333330, - 0.5333333333333330, - 0.5333333333333330, - 0.5333333333333330, - 0.5333333333333330, - 0.5423728813559320, - 0.5423728813559320, - 0.5333333333333330, - 0.5166666666666670, - 0.5333333333333330, - 0.5254237288135590, - 0.5254237288135590, - 0.5254237288135590, - 0.5333333333333330, - 0.5245901639344260, - 0.5081967213114750, - 0.4736842105263160, - 0.4655172413793100, - 0.4576271186440680, - 0.4482758620689660, - 0.4406779661016950, - 0.4406779661016950, - 0.4310344827586210, - 0.4310344827586210, - 0.4310344827586210, - 0.4310344827586210, - 0.4137931034482760, - 0.4137931034482760, - 0.3818181818181820, - 0.3818181818181820, - 0.3396226415094340, - 0.3333333333333330, - 0.3272727272727270, - 0.3272727272727270, - 0.3148148148148150, - 0.3148148148148150, - 0.3148148148148150, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.2962962962962960, - 0.2962962962962960, - 0.2830188679245280, - 0.2549019607843140, - 0.2600000000000000, - 0.2448979591836730, - 0.2400000000000000, - 0.2400000000000000, - 0.2307692307692310, - 0.2307692307692310, - 0.2307692307692310, - 0.2264150943396230, - 0.2068965517241380, - 0.2068965517241380, - 0.2068965517241380, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1864406779661020, - 0.1864406779661020, - 0.1774193548387100, - 0.1774193548387100, - 0.1774193548387100, - 0.1639344262295080, - 0.1451612903225810, - 0.1451612903225810, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1230769230769230, - 0.1230769230769230, - 0.1230769230769230, - 0.1230769230769230, - 0.1230769230769230, - 0.1212121212121210, - 0.1212121212121210, - 0.1212121212121210, - 0.1176470588235290, - 0.1176470588235290, - 0.1176470588235290, - 0.1176470588235290, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1044776119402990, - 0.1029411764705880, - 0.1044776119402990, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0597014925373134, - 0.0606060606060606, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0606060606060606, - 0.0606060606060606, - 0.0746268656716418, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0746268656716418, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0869565217391304, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1029411764705880, - 0.0909090909090909, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0937500000000000, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1029411764705880, - 0.1029411764705880, - 0.0895522388059701, - 0.0909090909090909, - 0.0909090909090909, - 0.0923076923076923, - 0.0909090909090909, - 0.0909090909090909, - 0.0923076923076923, - 0.0952380952380952, - 0.0952380952380952, - 0.0967741935483871, - 0.1000000000000000, - 0.1000000000000000, - 0.1016949152542370, - 0.0967741935483871, - 0.0833333333333333, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0952380952380952, - 0.0952380952380952, - 0.1111111111111110, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1076923076923080, - 0.1093750000000000, - 0.1111111111111110, - 0.1093750000000000, - 0.1111111111111110, - 0.1111111111111110, - 0.0967741935483871, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0967741935483871, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0983606557377049, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0862068965517241, - 0.0862068965517241, - 0.0833333333333333, - 0.0833333333333333, - 0.0806451612903226, - 0.0819672131147541, - 0.0793650793650794, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0793650793650794, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0833333333333333, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0757575757575758, - 0.0757575757575758, - 0.0769230769230769, - 0.0769230769230769, - 0.0781250000000000, - 0.0781250000000000, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0952380952380952, - 0.0967741935483871, - 0.0983606557377049, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1016949152542370, - 0.1016949152542370, - 0.1186440677966100, - 0.1147540983606560, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1269841269841270, - 0.1269841269841270, - 0.1290322580645160, - 0.1290322580645160, - 0.1269841269841270, - 0.1290322580645160, - 0.1290322580645160, - 0.1311475409836070, - 0.1311475409836070, - 0.1290322580645160, - 0.1311475409836070, - 0.1451612903225810, - 0.1333333333333330, - 0.1311475409836070, - 0.1475409836065570, - 0.1475409836065570, - 0.1500000000000000, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1774193548387100, - 0.1904761904761900, - 0.1935483870967740, - 0.1967213114754100, - 0.1967213114754100, - 0.1833333333333330, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1896551724137930, - 0.2033898305084750, - 0.2000000000000000, - 0.1967213114754100, - 0.1833333333333330, - 0.1833333333333330, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1724137931034480, - 0.1864406779661020, - 0.1896551724137930, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1694915254237290, - 0.1833333333333330, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1833333333333330, - 0.1833333333333330, - 0.1864406779661020, - 0.1864406779661020, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.2105263157894740, - 0.2068965517241380, - 0.2068965517241380, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2280701754385960, - 0.2280701754385960, - 0.2321428571428570, - 0.2321428571428570, - 0.2321428571428570, - 0.2280701754385960, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2280701754385960, - 0.2000000000000000, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1964285714285710, - 0.2241379310344830, - 0.2280701754385960, - 0.2280701754385960, - 0.2321428571428570, - 0.2407407407407410, - 0.2407407407407410, - 0.2407407407407410, - 0.2363636363636360, - 0.2363636363636360, - 0.2363636363636360, - 0.2363636363636360, - 0.2363636363636360, - 0.2363636363636360, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2307692307692310, - 0.2307692307692310, - 0.2352941176470590, - 0.2352941176470590, - 0.2400000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2884615384615380, - 0.2884615384615380, - 0.2884615384615380, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2982456140350880, - 0.2982456140350880, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3148148148148150, - 0.3396226415094340, - 0.3396226415094340, - 0.3461538461538460, - 0.3461538461538460, - 0.3461538461538460, - 0.3529411764705880, - 0.3529411764705880, - 0.3584905660377360, - 0.3888888888888890, - 0.3888888888888890, - 0.3962264150943400, - 0.3888888888888890, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.4038461538461540, - 0.4117647058823530, - 0.4117647058823530, - 0.4117647058823530, - 0.4285714285714290, - 0.4285714285714290, - 0.4200000000000000, - 0.4117647058823530, - 0.4230769230769230, - 0.4117647058823530, - 0.4200000000000000, - 0.4200000000000000, - 0.4200000000000000, - 0.4200000000000000, - 0.4313725490196080, - 0.4230769230769230, - 0.4400000000000000, - 0.4400000000000000, - 0.4400000000000000, - 0.4509803921568630, - 0.4615384615384620, - 0.4615384615384620, - 0.4807692307692310, - 0.4807692307692310, - 0.4901960784313730, - 0.4901960784313730, - 0.5098039215686270, - 0.5098039215686270, - 0.5000000000000000, - 0.5192307692307690, - 0.5294117647058820, - 0.5490196078431370, - 0.5490196078431370, - 0.5600000000000000, - 0.5576923076923080, - 0.5686274509803920, - 0.5800000000000000, - 0.5800000000000000, - 0.5882352941176470, - 0.6000000000000000, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6226415094339620, - 0.6296296296296300, - 0.6296296296296300, - 0.6415094339622640, - 0.6481481481481480, - 0.6415094339622640, - 0.6415094339622640, - 0.6538461538461540, - 0.6538461538461540, - 0.6603773584905660, - 0.6603773584905660, - 0.6666666666666670, - 0.6800000000000000, - 0.6730769230769230, - 0.6666666666666670, - 0.6923076923076920, - 0.6923076923076920, - 0.6792452830188680, - 0.6923076923076920, - 0.6981132075471700, - 0.6981132075471700, - 0.6981132075471700, - 0.6981132075471700, - 0.6981132075471700, - 0.7115384615384620, - 0.7115384615384620, - 0.7254901960784310, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7222222222222220, - 0.7222222222222220, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7090909090909090, - 0.7222222222222220, - 0.7222222222222220, - 0.7017543859649120, - 0.7017543859649120, - 0.6779661016949150, - 0.6885245901639340, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7142857142857140, - 0.7142857142857140, - 0.7096774193548390, - 0.7096774193548390, - 0.6984126984126980, - 0.6885245901639340, - 0.6885245901639340, - 0.6885245901639340, - 0.7000000000000000, - 0.6774193548387100, - 0.6774193548387100, - 0.6774193548387100, - 0.6774193548387100, - 0.6721311475409840, - 0.6557377049180330, - 0.6557377049180330, - 0.6666666666666670, - 0.6779661016949150, - 0.6779661016949150, - 0.6779661016949150, - 0.6779661016949150, - 0.6779661016949150, - 0.7272727272727270, - 0.7017543859649120, - 0.7017543859649120, - 0.7068965517241380, - 0.7068965517241380, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7321428571428570, - 0.7368421052631580, - 0.7368421052631580, - 0.7368421052631580, - 0.7543859649122810, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7857142857142860, - 0.7857142857142860, - 0.7857142857142860, - 0.7894736842105260, - 0.7931034482758620, - 0.7931034482758620, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.7833333333333330, - 0.7833333333333330, - 0.7833333333333330, - 0.7833333333333330, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7868852459016390, - 0.7868852459016390, - 0.7868852459016390, - 0.7741935483870970, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7903225806451610, - 0.7903225806451610, - 0.7903225806451610, - 0.7903225806451610, - 0.7903225806451610, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8032786885245900, - 0.8032786885245900, - 0.8032786885245900, - 0.8095238095238100, - 0.8095238095238100, - 0.8095238095238100, - 0.8095238095238100, - 0.8095238095238100, - 0.8095238095238100, - 0.8032786885245900, - 0.8064516129032260, - 0.8064516129032260, - 0.8064516129032260, - 0.8064516129032260, - 0.8064516129032260, - 0.8064516129032260, - 0.8064516129032260, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8166666666666670, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8196721311475410, - 0.8166666666666670, - 0.8196721311475410, - 0.8196721311475410, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8666666666666670, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8709677419354840, - 0.8709677419354840, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8833333333333330, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8906250000000000, - 0.8906250000000000, - 0.8923076923076920, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8939393939393940, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.8955223880597010, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.9016393442622950, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.8852459016393440, - 0.8833333333333330, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8596491228070170, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8070175438596490, - 0.8070175438596490, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.8000000000000000, - 0.7962962962962960, - 0.7924528301886790, - 0.7884615384615380, - 0.7843137254901960, - 0.7843137254901960, - 0.7692307692307690, - 0.7692307692307690, - 0.7692307692307690, - 0.7547169811320760, - 0.7547169811320760, - 0.7407407407407410, - 0.7407407407407410, - 0.7272727272727270, - 0.7222222222222220, - 0.6842105263157900, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6724137931034480, - 0.6607142857142860, - 0.6545454545454550, - 0.6481481481481480, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6603773584905660, - 0.6481481481481480, - 0.6481481481481480, - 0.6481481481481480, - 0.6481481481481480, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6181818181818180, - 0.6181818181818180, - 0.6111111111111110, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.5925925925925930, - 0.5925925925925930, - 0.5925925925925930, - 0.5849056603773580, - 0.5740740740740740, - 0.5740740740740740, - 0.5660377358490570, - 0.5660377358490570, - 0.5555555555555560, - 0.5471698113207550, - 0.5370370370370370, - 0.5370370370370370, - 0.5370370370370370, - 0.5370370370370370, - 0.5370370370370370, - 0.5272727272727270, - 0.5272727272727270, - 0.5000000000000000, - 0.5000000000000000, - 0.5000000000000000, - 0.5000000000000000, - 0.4905660377358490, - 0.4905660377358490, - 0.4905660377358490, - 0.4905660377358490, - 0.4814814814814810, - 0.4905660377358490, - 0.4807692307692310, - 0.4807692307692310, - 0.4807692307692310, - 0.4807692307692310, - 0.4705882352941180, - 0.4615384615384620, - 0.4509803921568630, - 0.4509803921568630, - 0.4509803921568630, - 0.4509803921568630, - 0.4489795918367350, - 0.4489795918367350, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4255319148936170, - 0.4347826086956520, - 0.4347826086956520, - 0.4222222222222220, - 0.4222222222222220, - 0.4130434782608700, - 0.4130434782608700, - 0.4130434782608700, - 0.4000000000000000, - 0.3720930232558140, - 0.3720930232558140, - 0.3636363636363640, - 0.3555555555555560, - 0.3478260869565220, - 0.3404255319148940, - 0.3111111111111110, - 0.3111111111111110, - 0.2954545454545450, - 0.2888888888888890, - 0.2888888888888890, - 0.2888888888888890, - 0.2708333333333330, - 0.2708333333333330, - 0.2553191489361700, - 0.2553191489361700, - 0.2553191489361700, - 0.2553191489361700, - 0.2553191489361700, - 0.2553191489361700, - 0.2553191489361700, - 0.2391304347826090, - 0.2391304347826090, - 0.2444444444444440, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2200000000000000, - 0.2040816326530610, - 0.1960784313725490, - 0.1960784313725490, - 0.1960784313725490, - 0.1923076923076920, - 0.1923076923076920, - 0.1923076923076920, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1818181818181820, - 0.1666666666666670, - 0.1666666666666670, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1578947368421050, - 0.1403508771929820, - 0.1403508771929820, - 0.1379310344827590, - 0.1379310344827590, - 0.1355932203389830, - 0.1355932203389830, - 0.1355932203389830, - 0.1355932203389830, - 0.1355932203389830, - 0.1355932203389830, - 0.1379310344827590, - 0.1379310344827590, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1206896551724140, - 0.1206896551724140, - 0.1206896551724140, - 0.1206896551724140, - 0.1052631578947370, - 0.1071428571428570, - 0.1052631578947370, - 0.1052631578947370, - 0.1052631578947370, - 0.1052631578947370, - 0.1052631578947370, - 0.1052631578947370, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0727272727272727, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0740740740740741, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0784313725490196, - 0.0784313725490196, - 0.0769230769230769, - 0.0769230769230769, - 0.0784313725490196, - 0.0784313725490196, - 0.0754716981132075, - 0.0754716981132075, - 0.0740740740740741, - 0.0740740740740741, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0892857142857143, - 0.0909090909090909, - 0.0909090909090909, - 0.0877192982456140, - 0.0877192982456140, - 0.0892857142857143, - 0.0892857142857143, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0526315789473684, - 0.0517241379310345, - 0.0517241379310345, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0847457627118644, - 0.0847457627118644, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0714285714285714, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0740740740740741, - 0.0754716981132075, - 0.0754716981132075, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0754716981132075, - 0.0754716981132075, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0754716981132075, - 0.0754716981132075, - 0.0769230769230769, - 0.0769230769230769, - 0.0784313725490196, - 0.0800000000000000, - 0.0800000000000000, - 0.0816326530612245, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.1000000000000000, - 0.1020408163265310, - 0.1041666666666670, - 0.1224489795918370, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1538461538461540, - 0.1698113207547170, - 0.1698113207547170, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1346153846153850, - 0.1509433962264150, - 0.1509433962264150, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1481481481481480, - 0.1481481481481480, - 0.1636363636363640, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1896551724137930, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2307692307692310, - 0.2307692307692310, - 0.2352941176470590, - 0.2307692307692310, - 0.2307692307692310, - 0.2307692307692310, - 0.2307692307692310, - 0.2307692307692310, - 0.2307692307692310, - 0.2307692307692310, - 0.2352941176470590, - 0.2352941176470590, - 0.2352941176470590, - 0.2500000000000000, - 0.2549019607843140, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2800000000000000, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2916666666666670, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2916666666666670, - 0.3000000000000000, - 0.3000000000000000, - 0.3137254901960780, - 0.3137254901960780, - 0.3200000000000000, - 0.3200000000000000, - 0.3061224489795920, - 0.3061224489795920, - 0.3061224489795920, - 0.3125000000000000, - 0.3125000000000000, - 0.3125000000000000, - 0.3061224489795920, - 0.3333333333333330, - 0.3333333333333330, - 0.3269230769230770, - 0.3269230769230770, - 0.3269230769230770, - 0.3269230769230770, - 0.3541666666666670, - 0.3541666666666670, - 0.3617021276595740, - 0.3750000000000000, - 0.3829787234042550, - 0.3913043478260870, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3913043478260870, - 0.3913043478260870, - 0.4042553191489360, - 0.4130434782608700, - 0.4318181818181820, - 0.4444444444444440, - 0.4545454545454550, - 0.4545454545454550, - 0.4761904761904760, - 0.4651162790697670, - 0.4545454545454550, - 0.4545454545454550, - 0.4651162790697670, - 0.4545454545454550, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4545454545454550, - 0.4418604651162790, - 0.4523809523809520, - 0.4523809523809520, - 0.4878048780487810, - 0.4878048780487810, - 0.5000000000000000, - 0.5000000000000000, - 0.5116279069767440, - 0.5116279069767440, - 0.5227272727272730, - 0.5227272727272730, - 0.5348837209302320, - 0.5348837209302320, - 0.5348837209302320, - 0.5348837209302320, - 0.5348837209302320, - 0.5476190476190480, - 0.5348837209302320, - 0.5348837209302320, - 0.5476190476190480, - 0.5476190476190480, - 0.5454545454545450, - 0.5714285714285710, - 0.5909090909090910, - 0.5777777777777780, - 0.6000000000000000, - 0.6000000000000000, - 0.6170212765957450, - 0.6304347826086960, - 0.6250000000000000, - 0.6250000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.5882352941176470, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6078431372549020, - 0.5961538461538460, - 0.5961538461538460, - 0.5961538461538460, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.6037735849056600, - 0.6153846153846150, - 0.6274509803921570, - 0.6274509803921570, - 0.6274509803921570, - 0.6274509803921570, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6326530612244900, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6530612244897960, - 0.6530612244897960, - 0.6600000000000000, - 0.6734693877551020, - 0.6734693877551020, - 0.6734693877551020, - 0.6734693877551020, - 0.6666666666666670, - 0.6666666666666670, - 0.6734693877551020, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.7021276595744680, - 0.7021276595744680, - 0.7021276595744680, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7021276595744680, - 0.7021276595744680, - 0.7021276595744680, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.6600000000000000, - 0.6470588235294120, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6603773584905660, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6603773584905660, - 0.6603773584905660, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7058823529411760, - 0.7058823529411760, - 0.7200000000000000, - 0.7200000000000000, - 0.7200000000000000, - 0.7254901960784310, - 0.7254901960784310, - 0.7254901960784310, - 0.7254901960784310, - 0.7254901960784310, - 0.7307692307692310, - 0.7307692307692310, - 0.7307692307692310, - 0.7307692307692310, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7272727272727270, - 0.7142857142857140, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7090909090909090, - 0.6964285714285710, - 0.6964285714285710, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7222222222222220, - 0.7222222222222220, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7307692307692310, - 0.7450980392156860, - 0.7450980392156860, - 0.7600000000000000, - 0.7600000000000000, - 0.7647058823529410, - 0.7647058823529410, - 0.7358490566037730, - 0.7407407407407410, - 0.7407407407407410, - 0.7407407407407410, - 0.7407407407407410, - 0.7547169811320760, - 0.7647058823529410, - 0.7647058823529410, - 0.7647058823529410, - 0.7647058823529410, - 0.7647058823529410, - 0.7647058823529410, - 0.7547169811320760, - 0.7547169811320760, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7777777777777780, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.8070175438596490, - 0.8070175438596490, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8518518518518520, - 0.8518518518518520, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8867924528301890, - 0.8867924528301890, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8909090909090910, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8867924528301890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8679245283018870, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8653846153846150, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8800000000000000, - 0.8800000000000000, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8775510204081630, - 0.8958333333333330, - 0.8958333333333330, - 0.8958333333333330, - 0.8958333333333330, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8800000000000000, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.8800000000000000, - 0.8627450980392160, - 0.8571428571428570, - 0.8541666666666670, - 0.8541666666666670, - 0.8510638297872340, - 0.8478260869565220, - 0.8478260869565220, - 0.8478260869565220, - 0.8297872340425530, - 0.8125000000000000, - 0.7959183673469390, - 0.7916666666666670, - 0.7916666666666670, - 0.7916666666666670, - 0.7916666666666670, - 0.7916666666666670, - 0.7872340425531920, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7659574468085110, - 0.7659574468085110, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7446808510638300, - 0.7446808510638300, - 0.7391304347826090, - 0.7391304347826090, - 0.7555555555555560, - 0.7727272727272730, - 0.7906976744186050, - 0.7954545454545450, - 0.7954545454545450, - 0.7954545454545450, - 0.7954545454545450, - 0.7954545454545450, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7608695652173910, - 0.7608695652173910, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7446808510638300, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7446808510638300, - 0.7446808510638300, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7608695652173910, - 0.7446808510638300, - 0.7446808510638300, - 0.7446808510638300, - 0.7555555555555560, - 0.7608695652173910, - 0.7659574468085110, - 0.7659574468085110, - 0.7500000000000000, - 0.7500000000000000, - 0.7346938775510200, - 0.7291666666666670, - 0.7234042553191490, - 0.7291666666666670, - 0.7142857142857140, - 0.7142857142857140, - 0.7446808510638300, - 0.7446808510638300, - 0.7391304347826090, - 0.7391304347826090, - 0.7391304347826090, - 0.7391304347826090, - 0.6938775510204080, - 0.7021276595744680, - 0.7021276595744680, - 0.7021276595744680, - 0.7021276595744680, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.7111111111111110, - 0.7173913043478260, - 0.7111111111111110, - 0.7272727272727270, - 0.7272727272727270, - 0.7209302325581400, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6808510638297870, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6808510638297870, - 0.6666666666666670, - 0.6666666666666670, - 0.6734693877551020, - 0.6666666666666670, - 0.6530612244897960, - 0.6400000000000000, - 0.6400000000000000, - 0.6530612244897960, - 0.6666666666666670, - 0.6666666666666670, - 0.6734693877551020, - 0.6938775510204080, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.6862745098039220, - 0.6862745098039220, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7083333333333330, - 0.7021276595744680, - 0.7021276595744680, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.7021276595744680, - 0.7083333333333330, - 0.7083333333333330, - 0.6938775510204080, - 0.6938775510204080, - 0.7083333333333330, - 0.6938775510204080, - 0.7000000000000000, - 0.7000000000000000, - 0.6862745098039220, - 0.6730769230769230, - 0.6666666666666670, - 0.6730769230769230, - 0.6730769230769230, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6792452830188680, - 0.6730769230769230, - 0.6730769230769230, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6545454545454550, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6603773584905660, - 0.6603773584905660, - 0.6603773584905660, - 0.6603773584905660, - 0.6603773584905660, - 0.6538461538461540, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6481481481481480, - 0.6481481481481480, - 0.6481481481481480, - 0.6603773584905660, - 0.6730769230769230, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6730769230769230, - 0.6730769230769230, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6800000000000000, - 0.6938775510204080, - 0.6800000000000000, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6730769230769230, - 0.6666666666666670, - 0.6666666666666670, - 0.6600000000000000, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6600000000000000, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6530612244897960, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6326530612244900, - 0.6200000000000000, - 0.6200000000000000, - 0.6200000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.6041666666666670, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5869565217391300, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5833333333333330, - 0.5625000000000000, - 0.5625000000000000, - 0.5625000000000000, - 0.5625000000000000, - 0.5625000000000000, - 0.5625000000000000, - 0.5531914893617020, - 0.5531914893617020, - 0.5531914893617020, - 0.5652173913043480, - 0.5652173913043480, - 0.5652173913043480, - 0.5652173913043480, - 0.5652173913043480, - 0.5434782608695650, - 0.5434782608695650, - 0.5434782608695650, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5652173913043480, - 0.5652173913043480, - 0.5652173913043480, - 0.5744680851063830, - 0.5744680851063830, - 0.5744680851063830, - 0.5744680851063830, - 0.5744680851063830, - 0.5869565217391300, - 0.5869565217391300, - 0.5744680851063830, - 0.5744680851063830, - 0.5744680851063830, - 0.5744680851063830, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5833333333333330, - 0.5833333333333330, - 0.5714285714285710, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5800000000000000, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.5918367346938780, - 0.6000000000000000, - 0.5882352941176470, - 0.5961538461538460, - 0.5849056603773580, - 0.5925925925925930, - 0.5925925925925930, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5961538461538460, - 0.6037735849056600, - 0.5961538461538460, - 0.5961538461538460, - 0.5961538461538460, - 0.5961538461538460, - 0.5961538461538460, - 0.6122448979591840, - 0.6078431372549020, - 0.6078431372549020, - 0.6200000000000000, - 0.6200000000000000, - 0.6200000000000000, - 0.6200000000000000, - 0.6274509803921570, - 0.6274509803921570, - 0.6274509803921570, - 0.6274509803921570, - 0.6153846153846150, - 0.6037735849056600, - 0.5961538461538460, - 0.5961538461538460, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5818181818181820, - 0.5818181818181820, - 0.5818181818181820, - 0.5818181818181820, - 0.5818181818181820, - 0.5925925925925930, - 0.6037735849056600, - 0.6037735849056600, - 0.6037735849056600, - 0.5925925925925930, - 0.5925925925925930, - 0.5925925925925930, - 0.6000000000000000, - 0.5892857142857140, - 0.5892857142857140, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6071428571428570, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6296296296296300, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6111111111111110, - 0.6037735849056600, - 0.5925925925925930, - 0.5925925925925930, - 0.6000000000000000, - 0.6000000000000000, - 0.6111111111111110, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6037735849056600, - 0.6037735849056600, - 0.6037735849056600, - 0.5925925925925930, - 0.6000000000000000, - 0.6037735849056600, - 0.6153846153846150, - 0.6153846153846150, - 0.6274509803921570, - 0.6274509803921570, - 0.6346153846153850, - 0.6346153846153850, - 0.6226415094339620, - 0.6226415094339620, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6415094339622640, - 0.6226415094339620, - 0.6226415094339620, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6481481481481480, - 0.6481481481481480, - 0.6481481481481480, - 0.6481481481481480, - 0.6415094339622640, - 0.6415094339622640, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6481481481481480, - 0.6545454545454550, - 0.6545454545454550, - 0.6428571428571430, - 0.6428571428571430, - 0.6428571428571430, - 0.6428571428571430, - 0.6491228070175440, - 0.6491228070175440, - 0.6491228070175440, - 0.6491228070175440, - 0.6607142857142860, - 0.6666666666666670, - 0.6603773584905660, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6470588235294120, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6470588235294120, - 0.6470588235294120, - 0.6734693877551020, - 0.6734693877551020, - 0.6734693877551020, - 0.6734693877551020, - 0.6734693877551020, - 0.6666666666666670, - 0.6734693877551020, - 0.6734693877551020, - 0.6734693877551020, - 0.6666666666666670, - 0.6666666666666670, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6458333333333330, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6200000000000000, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6400000000000000, - 0.6400000000000000, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6346153846153850, - 0.6346153846153850, - 0.6200000000000000, - 0.6200000000000000, - 0.6200000000000000, - 0.6200000000000000, - 0.6200000000000000, - 0.6326530612244900, - 0.6530612244897960, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6530612244897960, - 0.6600000000000000, - 0.6600000000000000, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6470588235294120, - 0.6400000000000000, - 0.6400000000000000, - 0.6530612244897960, - 0.6530612244897960, - 0.6666666666666670, - 0.6666666666666670, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6530612244897960, - 0.6400000000000000, - 0.6274509803921570, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6153846153846150, - 0.6037735849056600, - 0.6037735849056600, - 0.5961538461538460, - 0.6037735849056600, - 0.6037735849056600, - 0.6037735849056600, - 0.6037735849056600, - 0.5961538461538460, - 0.5740740740740740, - 0.5740740740740740, - 0.5740740740740740, - 0.5740740740740740, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.5849056603773580, - 0.6000000000000000, - 0.6181818181818180, - 0.6181818181818180, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6037735849056600, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6111111111111110, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.6226415094339620, - 0.6226415094339620, - 0.6037735849056600, - 0.6037735849056600, - 0.6111111111111110, - 0.6181818181818180, - 0.6071428571428570, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5862068965517240, - 0.5862068965517240, - 0.6000000000000000, - 0.6000000000000000, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5789473684210530, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5789473684210530, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.5892857142857140, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6111111111111110, - 0.6181818181818180, - 0.6181818181818180, - 0.6415094339622640, - 0.6415094339622640, - 0.6538461538461540, - 0.6538461538461540, - 0.6862745098039220, - 0.7000000000000000, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.6862745098039220, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7000000000000000, - 0.7200000000000000, - 0.7346938775510200, - 0.6923076923076920, - 0.6923076923076920, - 0.6923076923076920, - 0.6923076923076920, - 0.7058823529411760, - 0.7058823529411760, - 0.7058823529411760, - 0.7058823529411760, - 0.7058823529411760, - 0.7058823529411760, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6909090909090910, - 0.6909090909090910, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7090909090909090, - 0.7222222222222220, - 0.7358490566037730, - 0.7222222222222220, - 0.7222222222222220, - 0.7272727272727270, - 0.7142857142857140, - 0.7192982456140350, - 0.7241379310344830, - 0.7241379310344830, - 0.7241379310344830, - 0.7241379310344830, - 0.7241379310344830, - 0.7368421052631580, - 0.7368421052631580, - 0.7368421052631580, - 0.7413793103448280, - 0.7543859649122810, - 0.7543859649122810, - 0.7543859649122810, - 0.7543859649122810, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7719298245614030, - 0.7719298245614030, - 0.7758620689655170, - 0.7758620689655170, - 0.7758620689655170, - 0.7758620689655170, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7857142857142860, - 0.7857142857142860, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8070175438596490, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8035714285714290, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8103448275862070, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8363636363636360, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8269230769230770, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8400000000000000, - 0.8400000000000000, - 0.8400000000000000, - 0.8400000000000000, - 0.8400000000000000, - 0.8400000000000000, - 0.8431372549019610, - 0.8431372549019610, - 0.8431372549019610, - 0.8431372549019610, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8775510204081630, - 0.8775510204081630, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8936170212765960, - 0.8936170212765960, - 0.8936170212765960, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8222222222222220, - 0.8043478260869560, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7755102040816330, - 0.7755102040816330, - 0.7755102040816330, - 0.7755102040816330, - 0.7755102040816330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7551020408163260, - 0.7551020408163260, - 0.7551020408163260, - 0.7551020408163260, - 0.7551020408163260, - 0.7551020408163260, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7346938775510200, - 0.7346938775510200, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7234042553191490, - 0.7083333333333330, - 0.7021276595744680, - 0.6875000000000000, - 0.6734693877551020, - 0.6734693877551020, - 0.6666666666666670, - 0.6808510638297870, - 0.6808510638297870, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6666666666666670, - 0.6818181818181820, - 0.6818181818181820, - 0.6818181818181820, - 0.6818181818181820, - 0.6666666666666670, - 0.6739130434782610, - 0.6956521739130430, - 0.6956521739130430, - 0.7045454545454550, - 0.7045454545454550, - 0.7045454545454550, - 0.7209302325581400, - 0.7333333333333330, - 0.7333333333333330, - 0.7173913043478260, - 0.7173913043478260, - 0.7111111111111110, - 0.7111111111111110, - 0.7272727272727270, - 0.7441860465116280, - 0.7441860465116280, - 0.7441860465116280, - 0.7500000000000000, - 0.7333333333333330, - 0.7391304347826090, - 0.7391304347826090, - 0.7446808510638300, - 0.7446808510638300, - 0.7291666666666670, - 0.7500000000000000, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7551020408163260, - 0.7551020408163260, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7551020408163260, - 0.7551020408163260, - 0.7600000000000000, - 0.7600000000000000, - 0.7450980392156860, - 0.7450980392156860, - 0.7600000000000000, - 0.7600000000000000, - 0.7600000000000000, - 0.7600000000000000, - 0.7551020408163260, - 0.7551020408163260, - 0.7551020408163260, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7346938775510200, - 0.7346938775510200, - 0.7346938775510200, - 0.7346938775510200, - 0.7346938775510200, - 0.7200000000000000, - 0.7346938775510200, - 0.7346938775510200, - 0.7200000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7551020408163260, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7446808510638300, - 0.7391304347826090, - 0.7391304347826090, - 0.7391304347826090, - 0.7391304347826090, - 0.7391304347826090, - 0.7446808510638300, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7291666666666670, - 0.7346938775510200, - 0.7346938775510200, - 0.7346938775510200, - 0.7346938775510200, - 0.7346938775510200, - 0.7200000000000000, - 0.7200000000000000, - 0.7200000000000000, - 0.7200000000000000, - 0.7200000000000000, - 0.7142857142857140, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7142857142857140, - 0.7083333333333330, - 0.7083333333333330, - 0.6938775510204080, - 0.6938775510204080, - 0.7021276595744680, - 0.7021276595744680, - 0.7173913043478260, - 0.7173913043478260, - 0.7272727272727270, - 0.7272727272727270, - 0.7111111111111110, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6808510638297870, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6888888888888890, - 0.6818181818181820, - 0.6818181818181820, - 0.6818181818181820, - 0.6818181818181820, - 0.6976744186046510, - 0.6976744186046510, - 0.7209302325581400, - 0.7142857142857140, - 0.6976744186046510, - 0.6976744186046510, - 0.6976744186046510, - 0.6818181818181820, - 0.6666666666666670, - 0.6382978723404260, - 0.6122448979591840, - 0.6122448979591840, - 0.6000000000000000, - 0.6000000000000000, - 0.5882352941176470, - 0.5882352941176470, - 0.5882352941176470, - 0.5882352941176470, - 0.6000000000000000, - 0.6122448979591840, - 0.6250000000000000, - 0.6250000000000000, - 0.6250000000000000, - 0.6250000000000000, - 0.6122448979591840, - 0.6122448979591840, - 0.6200000000000000, - 0.6200000000000000, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6458333333333330, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6521739130434780, - 0.6521739130434780, - 0.6521739130434780, - 0.6595744680851060, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6739130434782610, - 0.6808510638297870, - 0.6808510638297870, - 0.6956521739130430, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7272727272727270, - 0.7111111111111110, - 0.7111111111111110, - 0.7173913043478260, - 0.7111111111111110, - 0.7111111111111110, - 0.6956521739130430, - 0.6808510638297870, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6590909090909090, - 0.6590909090909090, - 0.6590909090909090, - 0.6590909090909090, - 0.6590909090909090, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6521739130434780, - 0.6521739130434780, - 0.6521739130434780, - 0.6444444444444440, - 0.6521739130434780, - 0.6521739130434780, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6521739130434780, - 0.6382978723404260, - 0.6382978723404260, - 0.6521739130434780, - 0.6521739130434780, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6595744680851060, - 0.6458333333333330, - 0.6458333333333330, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6458333333333330, - 0.6400000000000000, - 0.6400000000000000, - 0.6400000000000000, - 0.6274509803921570, - 0.6274509803921570, - 0.6274509803921570, - 0.6200000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6122448979591840, - 0.6122448979591840, - 0.6122448979591840, - 0.6122448979591840, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6122448979591840, - 0.6122448979591840, - 0.6250000000000000, - 0.6250000000000000, - 0.6304347826086960, - 0.6304347826086960, - 0.6304347826086960, - 0.6304347826086960, - 0.6444444444444440, - 0.6444444444444440, - 0.6304347826086960, - 0.6304347826086960, - 0.6304347826086960, - 0.6304347826086960, - 0.6382978723404260, - 0.6304347826086960, - 0.6444444444444440, - 0.6590909090909090, - 0.6444444444444440, - 0.6444444444444440, - 0.6222222222222220, - 0.6136363636363640, - 0.6046511627906980, - 0.6046511627906980, - 0.6046511627906980, - 0.6046511627906980, - 0.6136363636363640, - 0.6136363636363640, - 0.6136363636363640, - 0.6136363636363640, - 0.6136363636363640, - 0.6136363636363640, - 0.6136363636363640, - 0.6136363636363640, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6363636363636360, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6222222222222220, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6590909090909090, - 0.6590909090909090, - 0.6744186046511630, - 0.6744186046511630, - 0.6744186046511630, - 0.6744186046511630, - 0.6585365853658540, - 0.6829268292682930, - 0.6904761904761900, - 0.6744186046511630, - 0.6744186046511630, - 0.6744186046511630, - 0.6904761904761900, - 0.6904761904761900, - 0.6744186046511630, - 0.6744186046511630, - 0.6904761904761900, - 0.6904761904761900, - 0.6904761904761900, - 0.6744186046511630, - 0.6744186046511630, - 0.6744186046511630, - 0.6744186046511630, - 0.6744186046511630, - 0.6904761904761900, - 0.6904761904761900, - 0.6744186046511630, - 0.6744186046511630, - 0.6590909090909090, - 0.6590909090909090, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6444444444444440, - 0.6590909090909090, - 0.6590909090909090, - 0.6511627906976740, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6170212765957450, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.6086956521739130, - 0.6000000000000000, - 0.6000000000000000, - 0.6136363636363640, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6511627906976740, - 0.6511627906976740, - 0.6511627906976740, - 0.6590909090909090, - 0.6744186046511630, - 0.6744186046511630, - 0.6818181818181820, - 0.6818181818181820, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6739130434782610, - 0.6595744680851060, - 0.6595744680851060, - 0.6739130434782610, - 0.6976744186046510, - 0.6818181818181820, - 0.6888888888888890, - 0.6888888888888890, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6956521739130430, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6739130434782610, - 0.6739130434782610, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.6739130434782610, - 0.6888888888888890, - 0.6888888888888890, - 0.7045454545454550, - 0.7045454545454550, - 0.7045454545454550, - 0.7045454545454550, - 0.6739130434782610, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6808510638297870, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.6875000000000000, - 0.7021276595744680, - 0.7173913043478260, - 0.7173913043478260, - 0.7234042553191490, - 0.7021276595744680, - 0.7021276595744680, - 0.7083333333333330, - 0.7234042553191490, - 0.7234042553191490, - 0.7234042553191490, - 0.7234042553191490, - 0.7083333333333330, - 0.7083333333333330, - 0.6938775510204080, - 0.6938775510204080, - 0.6938775510204080, - 0.6938775510204080, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7291666666666670, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7659574468085110, - 0.7659574468085110, - 0.7826086956521740, - 0.7826086956521740, - 0.8043478260869560, - 0.8043478260869560, - 0.8043478260869560, - 0.8043478260869560, - 0.7826086956521740, - 0.7826086956521740, - 0.8000000000000000, - 0.8000000000000000, - 0.7826086956521740, - 0.7826086956521740, - 0.8043478260869560, - 0.8043478260869560, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7708333333333330, - 0.7755102040816330, - 0.7916666666666670, - 0.8085106382978720, - 0.8085106382978720, - 0.8125000000000000, - 0.8085106382978720, - 0.8085106382978720, - 0.8085106382978720, - 0.8085106382978720, - 0.8085106382978720, - 0.8260869565217390, - 0.8297872340425530, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8163265306122450, - 0.8125000000000000, - 0.8085106382978720, - 0.8085106382978720, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8222222222222220, - 0.8297872340425530, - 0.8297872340425530, - 0.8297872340425530, - 0.8297872340425530, - 0.8297872340425530, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8163265306122450, - 0.8163265306122450, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8541666666666670, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8541666666666670, - 0.8541666666666670, - 0.8541666666666670, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8723404255319150, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8775510204081630, - 0.8775510204081630, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8775510204081630, - 0.8958333333333330, - 0.8958333333333330, - 0.8958333333333330, - 0.8958333333333330, - 0.8958333333333330, - 0.8979591836734690, - 0.8979591836734690, - 0.8979591836734690, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.8979591836734690, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9019607843137260, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9200000000000000, - 0.9183673469387750, - 0.9000000000000000, - 0.9000000000000000, - 0.9019607843137260, - 0.9019607843137260, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9038461538461540, - 0.9056603773584910, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9074074074074070, - 0.9090909090909090, - 0.9259259259259260, - 0.9272727272727270, - 0.9272727272727270, - 0.9272727272727270, - 0.9285714285714290, - 0.9454545454545450, - 0.9454545454545450, - 0.9464285714285710, - 0.9464285714285710, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9636363636363640, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9642857142857140, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9649122807017540, - 0.9655172413793100, - 0.9655172413793100, - 0.9655172413793100, - 0.9655172413793100, - 0.9824561403508770, - 0.9824561403508770, - 0.9824561403508770 - } - }, - { PLACE_CATEG_ID_WORK, - { - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0181818181818182, - 0.0181818181818182, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0181818181818182, - 0.0181818181818182, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0350877192982456, - 0.0350877192982456, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0377358490566038, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0588235294117647, - 0.0588235294117647, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1698113207547170, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1886792452830190, - 0.1886792452830190, - 0.1886792452830190, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2115384615384620, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2641509433962260, - 0.2641509433962260, - 0.2641509433962260, - 0.2692307692307690, - 0.2800000000000000, - 0.2800000000000000, - 0.2916666666666670, - 0.2978723404255320, - 0.2978723404255320, - 0.2978723404255320, - 0.2978723404255320, - 0.2916666666666670, - 0.3200000000000000, - 0.3333333333333330, - 0.3461538461538460, - 0.3461538461538460, - 0.3461538461538460, - 0.3461538461538460, - 0.3529411764705880, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3725490196078430, - 0.3725490196078430, - 0.3725490196078430, - 0.3725490196078430, - 0.3725490196078430, - 0.3846153846153850, - 0.3846153846153850, - 0.4000000000000000, - 0.4117647058823530, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4489795918367350, - 0.4680851063829790, - 0.4680851063829790, - 0.4680851063829790, - 0.4680851063829790, - 0.5111111111111110, - 0.5217391304347830, - 0.5217391304347830, - 0.5217391304347830, - 0.5217391304347830, - 0.5217391304347830, - 0.5217391304347830, - 0.5319148936170210, - 0.5434782608695650, - 0.5434782608695650, - 0.5652173913043480, - 0.5652173913043480, - 0.5652173913043480, - 0.5652173913043480, - 0.5777777777777780, - 0.5777777777777780, - 0.5777777777777780, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6086956521739130, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6444444444444440, - 0.6444444444444440, - 0.6744186046511630, - 0.6818181818181820, - 0.6818181818181820, - 0.6818181818181820, - 0.6888888888888890, - 0.6888888888888890, - 0.6888888888888890, - 0.7045454545454550, - 0.7045454545454550, - 0.7045454545454550, - 0.7346938775510200, - 0.7346938775510200, - 0.7400000000000000, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7547169811320760, - 0.7547169811320760, - 0.7692307692307690, - 0.7692307692307690, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7735849056603770, - 0.7857142857142860, - 0.7857142857142860, - 0.7857142857142860, - 0.7857142857142860, - 0.8148148148148150, - 0.8148148148148150, - 0.8214285714285710, - 0.8214285714285710, - 0.8275862068965520, - 0.8275862068965520, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8620689655172410, - 0.8620689655172410, - 0.8666666666666670, - 0.8666666666666670, - 0.8524590163934430, - 0.8524590163934430, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8947368421052630, - 0.8947368421052630, - 0.8947368421052630, - 0.8947368421052630, - 0.8947368421052630, - 0.8947368421052630, - 0.8965517241379310, - 0.8965517241379310, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8852459016393440, - 0.8852459016393440, - 0.8833333333333330, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8852459016393440, - 0.8870967741935480, - 0.8870967741935480, - 0.8870967741935480, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9016393442622950, - 0.9016393442622950, - 0.9016393442622950, - 0.9016393442622950, - 0.9016393442622950, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.8983050847457630, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8666666666666670, - 0.8644067796610170, - 0.8666666666666670, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8360655737704920, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8474576271186440, - 0.8474576271186440, - 0.8500000000000000, - 0.8500000000000000, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8644067796610170, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8644067796610170, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8524590163934430, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8620689655172410, - 0.8620689655172410, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8833333333333330, - 0.8833333333333330, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8709677419354840, - 0.8709677419354840, - 0.8709677419354840, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8688524590163930, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8833333333333330, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8793103448275860, - 0.8771929824561400, - 0.8771929824561400, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8596491228070170, - 0.8596491228070170, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8214285714285710, - 0.8214285714285710, - 0.8214285714285710, - 0.8181818181818180, - 0.8181818181818180, - 0.8148148148148150, - 0.8148148148148150, - 0.8000000000000000, - 0.7962962962962960, - 0.7818181818181820, - 0.7777777777777780, - 0.7735849056603770, - 0.7692307692307690, - 0.7692307692307690, - 0.7692307692307690, - 0.7735849056603770, - 0.7735849056603770, - 0.7692307692307690, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7592592592592590, - 0.7454545454545450, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7192982456140350, - 0.7068965517241380, - 0.7068965517241380, - 0.7017543859649120, - 0.7142857142857140, - 0.7142857142857140, - 0.7272727272727270, - 0.7222222222222220, - 0.7222222222222220, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7017543859649120, - 0.7017543859649120, - 0.7017543859649120, - 0.6964285714285710, - 0.6964285714285710, - 0.6964285714285710, - 0.6964285714285710, - 0.6964285714285710, - 0.6964285714285710, - 0.6964285714285710, - 0.6964285714285710, - 0.7222222222222220, - 0.7222222222222220, - 0.7090909090909090, - 0.6964285714285710, - 0.7090909090909090, - 0.7090909090909090, - 0.6964285714285710, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7017543859649120, - 0.6785714285714290, - 0.6607142857142860, - 0.6491228070175440, - 0.6491228070175440, - 0.6428571428571430, - 0.6428571428571430, - 0.6428571428571430, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6363636363636360, - 0.6250000000000000, - 0.6250000000000000, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6111111111111110, - 0.6181818181818180, - 0.6181818181818180, - 0.6296296296296300, - 0.6296296296296300, - 0.6296296296296300, - 0.6111111111111110, - 0.6111111111111110, - 0.6226415094339620, - 0.6153846153846150, - 0.6153846153846150, - 0.6274509803921570, - 0.6037735849056600, - 0.5961538461538460, - 0.6078431372549020, - 0.6078431372549020, - 0.6078431372549020, - 0.5961538461538460, - 0.5882352941176470, - 0.5769230769230770, - 0.5769230769230770, - 0.5600000000000000, - 0.5510204081632650, - 0.5510204081632650, - 0.5510204081632650, - 0.5510204081632650, - 0.5400000000000000, - 0.5102040816326530, - 0.5102040816326530, - 0.5102040816326530, - 0.5102040816326530, - 0.5102040816326530, - 0.5000000000000000, - 0.4680851063829790, - 0.4680851063829790, - 0.4680851063829790, - 0.4680851063829790, - 0.4680851063829790, - 0.4680851063829790, - 0.4565217391304350, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.3695652173913040, - 0.3695652173913040, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3469387755102040, - 0.3111111111111110, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3333333333333330, - 0.3333333333333330, - 0.3170731707317070, - 0.3170731707317070, - 0.2790697674418600, - 0.2790697674418600, - 0.2727272727272730, - 0.2558139534883720, - 0.2558139534883720, - 0.2558139534883720, - 0.2500000000000000, - 0.2500000000000000, - 0.2391304347826090, - 0.2391304347826090, - 0.2444444444444440, - 0.2444444444444440, - 0.1818181818181820, - 0.1818181818181820, - 0.1702127659574470, - 0.1666666666666670, - 0.1632653061224490, - 0.1632653061224490, - 0.1600000000000000, - 0.1428571428571430, - 0.1400000000000000, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1538461538461540, - 0.1698113207547170, - 0.1509433962264150, - 0.1509433962264150, - 0.1372549019607840, - 0.1346153846153850, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1272727272727270, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1090909090909090, - 0.1071428571428570, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.1090909090909090, - 0.0925925925925926, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.0869565217391304, - 0.0888888888888889, - 0.0888888888888889, - 0.0888888888888889, - 0.0909090909090909, - 0.0909090909090909, - 0.0888888888888889, - 0.0888888888888889, - 0.0888888888888889, - 0.0888888888888889, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0851063829787234, - 0.0851063829787234, - 0.0851063829787234, - 0.1041666666666670, - 0.1000000000000000, - 0.1000000000000000, - 0.0816326530612245, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0961538461538462, - 0.0961538461538462, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0961538461538462, - 0.1000000000000000, - 0.1000000000000000, - 0.0961538461538462, - 0.0980392156862745, - 0.0980392156862745, - 0.1000000000000000, - 0.1041666666666670, - 0.1041666666666670, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0740740740740741, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0666666666666667, - 0.0666666666666667, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0517241379310345, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0517241379310345, - 0.0517241379310345, - 0.0526315789473684, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0338983050847458, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0545454545454545, - 0.0535714285714286, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.1090909090909090, - 0.1111111111111110, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1509433962264150, - 0.1818181818181820, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.2000000000000000, - 0.2037037037037040, - 0.2363636363636360, - 0.2363636363636360, - 0.2407407407407410, - 0.2407407407407410, - 0.2452830188679250, - 0.2452830188679250, - 0.2452830188679250, - 0.2500000000000000, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2745098039215690, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2941176470588230, - 0.2941176470588230, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3137254901960780, - 0.3269230769230770, - 0.3396226415094340, - 0.3396226415094340, - 0.3461538461538460, - 0.3653846153846150, - 0.3846153846153850, - 0.3846153846153850, - 0.3846153846153850, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.4117647058823530, - 0.4117647058823530, - 0.4117647058823530, - 0.4117647058823530, - 0.4200000000000000, - 0.4313725490196080, - 0.4313725490196080, - 0.4313725490196080, - 0.4313725490196080, - 0.4313725490196080, - 0.4313725490196080, - 0.4313725490196080, - 0.4200000000000000, - 0.4200000000000000, - 0.4200000000000000, - 0.4200000000000000, - 0.4200000000000000, - 0.4200000000000000, - 0.4313725490196080, - 0.4313725490196080, - 0.4509803921568630, - 0.4509803921568630, - 0.4509803921568630, - 0.4615384615384620, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.5098039215686270, - 0.5200000000000000, - 0.5306122448979590, - 0.5306122448979590, - 0.5306122448979590, - 0.5306122448979590, - 0.5625000000000000, - 0.5625000000000000, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.5957446808510640, - 0.6041666666666670, - 0.6041666666666670, - 0.6122448979591840, - 0.6122448979591840, - 0.6326530612244900, - 0.6400000000000000, - 0.6470588235294120, - 0.6470588235294120, - 0.6600000000000000, - 0.6600000000000000, - 0.6600000000000000, - 0.7021276595744680, - 0.7021276595744680, - 0.7173913043478260, - 0.7333333333333330, - 0.7333333333333330, - 0.7333333333333330, - 0.7333333333333330, - 0.7333333333333330, - 0.7727272727272730, - 0.7826086956521740, - 0.7872340425531920, - 0.7916666666666670, - 0.8163265306122450, - 0.8163265306122450, - 0.8200000000000000, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8148148148148150, - 0.8148148148148150, - 0.8148148148148150, - 0.8148148148148150, - 0.8245614035087720, - 0.8245614035087720, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8275862068965520, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8524590163934430, - 0.8524590163934430, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8709677419354840, - 0.8709677419354840, - 0.8593750000000000, - 0.8730158730158730, - 0.8730158730158730, - 0.8730158730158730, - 0.8593750000000000, - 0.8593750000000000, - 0.8593750000000000, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8615384615384620, - 0.8769230769230770, - 0.8769230769230770, - 0.8906250000000000, - 0.8906250000000000, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9193548387096770, - 0.9193548387096770, - 0.9193548387096770, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9166666666666670, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9491525423728810, - 0.9491525423728810, - 0.9491525423728810, - 0.9333333333333330, - 0.9333333333333330, - 0.9322033898305080, - 0.9322033898305080, - 0.9322033898305080, - 0.9322033898305080, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9310344827586210, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9152542372881350, - 0.9180327868852460, - 0.9180327868852460, - 0.9166666666666670, - 0.9016393442622950, - 0.9016393442622950, - 0.9016393442622950, - 0.9032258064516130, - 0.9047619047619050, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9062500000000000, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9076923076923080, - 0.9230769230769230, - 0.9230769230769230, - 0.9230769230769230, - 0.9218750000000000, - 0.9206349206349210, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9218750000000000, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9365079365079360, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9508196721311470, - 0.9508196721311470, - 0.9354838709677420, - 0.9354838709677420, - 0.9354838709677420, - 0.9333333333333330, - 0.9310344827586210, - 0.9298245614035090, - 0.9122807017543860, - 0.9122807017543860, - 0.9122807017543860, - 0.9122807017543860, - 0.9107142857142860, - 0.9090909090909090, - 0.9259259259259260, - 0.9259259259259260, - 0.9259259259259260, - 0.9259259259259260, - 0.9272727272727270, - 0.9259259259259260, - 0.9298245614035090, - 0.9298245614035090, - 0.9298245614035090, - 0.9310344827586210, - 0.9310344827586210, - 0.9333333333333330, - 0.9491525423728810, - 0.9491525423728810, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9344262295081970, - 0.9333333333333330, - 0.9333333333333330, - 0.9333333333333330, - 0.9322033898305080, - 0.9322033898305080, - 0.9322033898305080, - 0.9482758620689660, - 0.9482758620689660, - 0.9473684210526320, - 0.9482758620689660, - 0.9482758620689660, - 0.9473684210526320, - 0.9655172413793100, - 0.9655172413793100, - 0.9491525423728810, - 0.9491525423728810, - 0.9482758620689660, - 0.9491525423728810, - 0.9491525423728810, - 0.9491525423728810, - 0.9491525423728810, - 0.9491525423728810, - 0.9508196721311470, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9491525423728810, - 0.9491525423728810, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9508196721311470, - 0.9500000000000000, - 0.9500000000000000, - 0.9661016949152540, - 0.9655172413793100, - 0.9655172413793100, - 0.9655172413793100, - 0.9655172413793100, - 0.9655172413793100, - 0.9661016949152540, - 0.9661016949152540, - 0.9661016949152540, - 0.9661016949152540, - 0.9661016949152540, - 0.9661016949152540, - 0.9661016949152540, - 0.9500000000000000, - 0.9500000000000000, - 0.9500000000000000, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9516129032258060, - 0.9531250000000000, - 0.9531250000000000, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9687500000000000, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9677419354838710, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9682539682539680, - 0.9531250000000000, - 0.9531250000000000, - 0.9531250000000000, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9393939393939390, - 0.9393939393939390, - 0.9393939393939390, - 0.9393939393939390, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9538461538461540, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9516129032258060, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9523809523809520, - 0.9516129032258060, - 0.9365079365079360, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9206349206349210, - 0.9193548387096770, - 0.9193548387096770, - 0.9193548387096770, - 0.9193548387096770, - 0.9193548387096770, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9180327868852460, - 0.9032258064516130, - 0.9032258064516130, - 0.9032258064516130, - 0.8870967741935480, - 0.8593750000000000, - 0.8571428571428570, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8500000000000000, - 0.8360655737704920, - 0.8360655737704920, - 0.8225806451612900, - 0.8225806451612900, - 0.8225806451612900, - 0.8225806451612900, - 0.8360655737704920, - 0.8333333333333330, - 0.8474576271186440, - 0.8474576271186440, - 0.8333333333333330, - 0.8333333333333330, - 0.8064516129032260, - 0.7936507936507940, - 0.7812500000000000, - 0.7692307692307690, - 0.7692307692307690, - 0.7692307692307690, - 0.7692307692307690, - 0.7656250000000000, - 0.7692307692307690, - 0.7692307692307690, - 0.7692307692307690, - 0.7692307692307690, - 0.7656250000000000, - 0.7656250000000000, - 0.7619047619047620, - 0.7619047619047620, - 0.7619047619047620, - 0.7619047619047620, - 0.7619047619047620, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7343750000000000, - 0.7343750000000000, - 0.7343750000000000, - 0.7343750000000000, - 0.7343750000000000, - 0.7343750000000000, - 0.7343750000000000, - 0.7230769230769230, - 0.7187500000000000, - 0.7187500000000000, - 0.7187500000000000, - 0.7230769230769230, - 0.7230769230769230, - 0.7230769230769230, - 0.7142857142857140, - 0.7258064516129030, - 0.7213114754098360, - 0.7213114754098360, - 0.7213114754098360, - 0.7288135593220340, - 0.7321428571428570, - 0.7321428571428570, - 0.7321428571428570, - 0.7192982456140350, - 0.7272727272727270, - 0.7142857142857140, - 0.7142857142857140, - 0.7090909090909090, - 0.7222222222222220, - 0.7222222222222220, - 0.7222222222222220, - 0.7307692307692310, - 0.7037037037037040, - 0.7037037037037040, - 0.6909090909090910, - 0.6909090909090910, - 0.6785714285714290, - 0.6785714285714290, - 0.6785714285714290, - 0.6551724137931030, - 0.6551724137931030, - 0.6491228070175440, - 0.6428571428571430, - 0.6545454545454550, - 0.6250000000000000, - 0.6250000000000000, - 0.6250000000000000, - 0.6250000000000000, - 0.6481481481481480, - 0.6296296296296300, - 0.6274509803921570, - 0.6274509803921570, - 0.6153846153846150, - 0.6000000000000000, - 0.5918367346938780, - 0.5918367346938780, - 0.5800000000000000, - 0.5800000000000000, - 0.5800000000000000, - 0.5800000000000000, - 0.5686274509803920, - 0.5686274509803920, - 0.5714285714285710, - 0.5714285714285710, - 0.5714285714285710, - 0.5625000000000000, - 0.5625000000000000, - 0.5600000000000000, - 0.5510204081632650, - 0.5510204081632650, - 0.5510204081632650, - 0.5510204081632650, - 0.5192307692307690, - 0.5000000000000000, - 0.4821428571428570, - 0.4821428571428570, - 0.4821428571428570, - 0.4727272727272730, - 0.4727272727272730, - 0.4727272727272730, - 0.4561403508771930, - 0.4642857142857140, - 0.4642857142857140, - 0.4642857142857140, - 0.4642857142857140, - 0.4642857142857140, - 0.4464285714285710, - 0.4545454545454550, - 0.4629629629629630, - 0.4629629629629630, - 0.4629629629629630, - 0.4509803921568630, - 0.4230769230769230, - 0.4117647058823530, - 0.4117647058823530, - 0.4038461538461540, - 0.4117647058823530, - 0.4117647058823530, - 0.4117647058823530, - 0.4038461538461540, - 0.4038461538461540, - 0.3962264150943400, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4038461538461540, - 0.4038461538461540, - 0.4038461538461540, - 0.3962264150943400, - 0.3888888888888890, - 0.3888888888888890, - 0.3636363636363640, - 0.3636363636363640, - 0.3269230769230770, - 0.3148148148148150, - 0.3148148148148150, - 0.3148148148148150, - 0.2884615384615380, - 0.2884615384615380, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2553191489361700, - 0.2391304347826090, - 0.2391304347826090, - 0.2444444444444440, - 0.2391304347826090, - 0.2340425531914890, - 0.2500000000000000, - 0.2340425531914890, - 0.2340425531914890, - 0.2340425531914890, - 0.2340425531914890, - 0.2291666666666670, - 0.2291666666666670, - 0.2244897959183670, - 0.2291666666666670, - 0.2291666666666670, - 0.2083333333333330, - 0.2040816326530610, - 0.1875000000000000, - 0.1702127659574470, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1875000000000000, - 0.1875000000000000, - 0.2040816326530610, - 0.2040816326530610, - 0.2000000000000000, - 0.2000000000000000, - 0.1960784313725490, - 0.1960784313725490, - 0.1923076923076920, - 0.1923076923076920, - 0.1886792452830190, - 0.1698113207547170, - 0.1346153846153850, - 0.1346153846153850, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.0943396226415094, - 0.0925925925925926, - 0.0943396226415094, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.0909090909090909, - 0.0909090909090909, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0847457627118644, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0819672131147541, - 0.0806451612903226, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0666666666666667, - 0.0677966101694915, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0517241379310345, - 0.0517241379310345, - 0.0508474576271187, - 0.0500000000000000, - 0.0491803278688525, - 0.0500000000000000, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0476190476190476, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0468750000000000, - 0.0483870967741936, - 0.0483870967741936, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0344827586206897, - 0.0344827586206897, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0317460317460317, - 0.0317460317460317, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0149253731343284, - 0.0147058823529412, - 0.0147058823529412, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0500000000000000, - 0.0508474576271187, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0983606557377049, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.1034482758620690, - 0.1034482758620690, - 0.1034482758620690, - 0.1034482758620690, - 0.1034482758620690, - 0.1186440677966100, - 0.1166666666666670, - 0.1311475409836070, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1355932203389830, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1666666666666670, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1818181818181820, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.2181818181818180, - 0.2222222222222220, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2307692307692310, - 0.2352941176470590, - 0.2448979591836730, - 0.2600000000000000, - 0.2600000000000000, - 0.2549019607843140, - 0.2600000000000000, - 0.2745098039215690, - 0.2884615384615380, - 0.2884615384615380, - 0.2884615384615380, - 0.2884615384615380, - 0.2884615384615380, - 0.2941176470588230, - 0.2941176470588230, - 0.2941176470588230, - 0.3076923076923080, - 0.3137254901960780, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3207547169811320, - 0.3454545454545450, - 0.3454545454545450, - 0.3454545454545450, - 0.3454545454545450, - 0.3454545454545450, - 0.3454545454545450, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3750000000000000, - 0.3750000000000000, - 0.3859649122807020, - 0.3965517241379310, - 0.4181818181818180, - 0.4181818181818180, - 0.4363636363636360, - 0.4363636363636360, - 0.4464285714285710, - 0.4464285714285710, - 0.4727272727272730, - 0.4821428571428570, - 0.4821428571428570, - 0.4912280701754390, - 0.5172413793103450, - 0.5172413793103450, - 0.5263157894736840, - 0.5263157894736840, - 0.5263157894736840, - 0.5263157894736840, - 0.5263157894736840, - 0.5263157894736840, - 0.5660377358490570, - 0.5660377358490570, - 0.5660377358490570, - 0.5660377358490570, - 0.5660377358490570, - 0.5740740740740740, - 0.5818181818181820, - 0.5818181818181820, - 0.5925925925925930, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6111111111111110, - 0.6470588235294120, - 0.6666666666666670, - 0.6800000000000000, - 0.6938775510204080, - 0.6938775510204080, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7200000000000000, - 0.7200000000000000, - 0.7400000000000000, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7500000000000000, - 0.7500000000000000, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7358490566037730, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7547169811320760, - 0.7592592592592590, - 0.7592592592592590, - 0.7719298245614030, - 0.7719298245614030, - 0.7719298245614030, - 0.7758620689655170, - 0.7758620689655170, - 0.7758620689655170, - 0.7796610169491530, - 0.7796610169491530, - 0.8032786885245900, - 0.8032786885245900, - 0.8032786885245900, - 0.8064516129032260, - 0.8281250000000000, - 0.8281250000000000, - 0.8307692307692310, - 0.8307692307692310, - 0.8281250000000000, - 0.8281250000000000, - 0.8307692307692310, - 0.8307692307692310, - 0.8333333333333330, - 0.8333333333333330, - 0.8333333333333330, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8382352941176470, - 0.8405797101449270, - 0.8405797101449270, - 0.8382352941176470, - 0.8382352941176470, - 0.8382352941176470, - 0.8382352941176470, - 0.8382352941176470, - 0.8428571428571430, - 0.8450704225352110, - 0.8571428571428570, - 0.8571428571428570, - 0.8550724637681160, - 0.8550724637681160, - 0.8550724637681160, - 0.8676470588235290, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8787878787878790, - 0.8787878787878790, - 0.8787878787878790, - 0.8787878787878790, - 0.8787878787878790, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8840579710144930, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8985507246376810, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9000000000000000, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9130434782608700, - 0.9117647058823530, - 0.9130434782608700, - 0.9117647058823530, - 0.9104477611940300, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9090909090909090, - 0.9062500000000000, - 0.9076923076923080, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.9047619047619050, - 0.8769230769230770, - 0.8750000000000000, - 0.8730158730158730, - 0.8730158730158730, - 0.8730158730158730, - 0.8730158730158730, - 0.8730158730158730, - 0.8730158730158730, - 0.8593750000000000, - 0.8593750000000000, - 0.8615384615384620, - 0.8615384615384620, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8548387096774190, - 0.8571428571428570, - 0.8571428571428570, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8387096774193550, - 0.8387096774193550, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8666666666666670, - 0.8709677419354840, - 0.8593750000000000, - 0.8593750000000000, - 0.8593750000000000, - 0.8593750000000000, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8636363636363640, - 0.8695652173913040, - 0.8695652173913040, - 0.8714285714285710, - 0.8714285714285710, - 0.8714285714285710, - 0.8714285714285710, - 0.8714285714285710, - 0.8714285714285710, - 0.8714285714285710, - 0.8714285714285710, - 0.8732394366197180, - 0.8732394366197180, - 0.8857142857142860, - 0.8840579710144930, - 0.8970588235294120, - 0.8970588235294120, - 0.8955223880597010, - 0.8939393939393940, - 0.8955223880597010, - 0.8970588235294120, - 0.8985507246376810, - 0.9000000000000000, - 0.9000000000000000, - 0.8985507246376810, - 0.8985507246376810, - 0.8985507246376810, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.8970588235294120, - 0.8970588235294120, - 0.8955223880597010, - 0.8970588235294120, - 0.8970588235294120, - 0.8970588235294120, - 0.8985507246376810, - 0.8985507246376810, - 0.9000000000000000, - 0.9142857142857140, - 0.9142857142857140, - 0.9154929577464790, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9178082191780820, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9166666666666670, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9295774647887320, - 0.9305555555555560, - 0.9305555555555560, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9436619718309860, - 0.9444444444444440, - 0.9444444444444440, - 0.9436619718309860, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9428571428571430, - 0.9295774647887320, - 0.9285714285714290, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9275362318840580, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9142857142857140, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9154929577464790, - 0.9285714285714290, - 0.9275362318840580, - 0.9264705882352940, - 0.9264705882352940, - 0.9264705882352940, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9253731343283580, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9104477611940300, - 0.9117647058823530, - 0.9117647058823530, - 0.9130434782608700, - 0.9117647058823530, - 0.9130434782608700, - 0.9000000000000000, - 0.9000000000000000, - 0.8873239436619720, - 0.8873239436619720, - 0.8857142857142860, - 0.8840579710144930, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8823529411764710, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8656716417910450, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8382352941176470, - 0.8260869565217390, - 0.8260869565217390, - 0.8260869565217390, - 0.8235294117647060, - 0.8235294117647060, - 0.8260869565217390, - 0.8382352941176470, - 0.8382352941176470, - 0.8382352941176470, - 0.8382352941176470, - 0.8358208955223880, - 0.8484848484848480, - 0.8358208955223880, - 0.8358208955223880, - 0.8333333333333330, - 0.8208955223880600, - 0.8208955223880600, - 0.8208955223880600, - 0.8208955223880600, - 0.8208955223880600, - 0.8208955223880600, - 0.8208955223880600, - 0.8088235294117650, - 0.8059701492537310, - 0.8030303030303030, - 0.8030303030303030, - 0.8030303030303030, - 0.8030303030303030, - 0.8030303030303030, - 0.8000000000000000, - 0.8000000000000000, - 0.7878787878787880, - 0.7878787878787880, - 0.7761194029850750, - 0.7761194029850750, - 0.7727272727272730, - 0.7656250000000000, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7777777777777780, - 0.7903225806451610, - 0.8032786885245900, - 0.8032786885245900, - 0.8032786885245900, - 0.8032786885245900, - 0.8000000000000000, - 0.7868852459016390, - 0.7868852459016390, - 0.7868852459016390, - 0.7833333333333330, - 0.7833333333333330, - 0.7540983606557380, - 0.7500000000000000, - 0.7500000000000000, - 0.7377049180327870, - 0.7258064516129030, - 0.7258064516129030, - 0.7258064516129030, - 0.7258064516129030, - 0.7258064516129030, - 0.7213114754098360, - 0.7213114754098360, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7166666666666670, - 0.7118644067796610, - 0.7017543859649120, - 0.7090909090909090, - 0.6842105263157900, - 0.6842105263157900, - 0.6724137931034480, - 0.6666666666666670, - 0.6666666666666670, - 0.6607142857142860, - 0.6545454545454550, - 0.6428571428571430, - 0.6428571428571430, - 0.6428571428571430, - 0.6545454545454550, - 0.6481481481481480, - 0.6603773584905660, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6415094339622640, - 0.6415094339622640, - 0.6415094339622640, - 0.5833333333333330, - 0.5833333333333330, - 0.5833333333333330, - 0.5625000000000000, - 0.5625000000000000, - 0.5625000000000000, - 0.5510204081632650, - 0.5416666666666670, - 0.5416666666666670, - 0.5306122448979590, - 0.5000000000000000, - 0.4814814814814810, - 0.4385964912280700, - 0.4482758620689660, - 0.4310344827586210, - 0.4237288135593220, - 0.4166666666666670, - 0.4166666666666670, - 0.3833333333333330, - 0.3898305084745760, - 0.3898305084745760, - 0.3898305084745760, - 0.3793103448275860, - 0.3793103448275860, - 0.3728813559322030, - 0.3728813559322030, - 0.3728813559322030, - 0.3666666666666670, - 0.3606557377049180, - 0.3606557377049180, - 0.3548387096774190, - 0.3548387096774190, - 0.3437500000000000, - 0.3437500000000000, - 0.3437500000000000, - 0.3437500000000000, - 0.3281250000000000, - 0.3230769230769230, - 0.3230769230769230, - 0.3333333333333330, - 0.3225806451612900, - 0.3278688524590160, - 0.2931034482758620, - 0.2931034482758620, - 0.2881355932203390, - 0.2881355932203390, - 0.2881355932203390, - 0.2711864406779660, - 0.2786885245901640, - 0.2741935483870970, - 0.2542372881355930, - 0.2542372881355930, - 0.2542372881355930, - 0.2500000000000000, - 0.2459016393442620, - 0.2459016393442620, - 0.2459016393442620, - 0.2459016393442620, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2333333333333330, - 0.2295081967213110, - 0.2295081967213110, - 0.2295081967213110, - 0.2333333333333330, - 0.2203389830508470, - 0.2203389830508470, - 0.2166666666666670, - 0.2166666666666670, - 0.2131147540983610, - 0.2096774193548390, - 0.2307692307692310, - 0.2187500000000000, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2131147540983610, - 0.2000000000000000, - 0.2131147540983610, - 0.2000000000000000, - 0.2000000000000000, - 0.1967213114754100, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1875000000000000, - 0.1846153846153850, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1818181818181820, - 0.1764705882352940, - 0.1764705882352940, - 0.1791044776119400, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1818181818181820, - 0.1818181818181820, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.2033898305084750, - 0.2033898305084750, - 0.2033898305084750, - 0.2068965517241380, - 0.2068965517241380, - 0.2068965517241380, - 0.2142857142857140, - 0.2142857142857140, - 0.2105263157894740, - 0.2142857142857140, - 0.2142857142857140, - 0.2181818181818180, - 0.2181818181818180, - 0.2181818181818180, - 0.2181818181818180, - 0.2181818181818180, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2075471698113210, - 0.2037037037037040, - 0.2075471698113210, - 0.1886792452830190, - 0.1818181818181820, - 0.1666666666666670, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1754385964912280, - 0.1785714285714290, - 0.1636363636363640, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1551724137931030, - 0.1551724137931030, - 0.1525423728813560, - 0.1525423728813560, - 0.1500000000000000, - 0.1500000000000000, - 0.1500000000000000, - 0.1500000000000000, - 0.1333333333333330, - 0.1333333333333330, - 0.1355932203389830, - 0.1355932203389830, - 0.1379310344827590, - 0.1379310344827590, - 0.1403508771929820, - 0.1403508771929820, - 0.1403508771929820, - 0.1355932203389830, - 0.1355932203389830, - 0.1355932203389830, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1166666666666670, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.1076923076923080, - 0.1076923076923080, - 0.1060606060606060, - 0.1060606060606060, - 0.0923076923076923, - 0.0923076923076923, - 0.0909090909090909, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0895522388059701, - 0.0882352941176471, - 0.0882352941176471, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0869565217391304, - 0.0869565217391304, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0882352941176471, - 0.0895522388059701, - 0.0895522388059701, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.0882352941176471, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0869565217391304, - 0.0735294117647059, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0606060606060606, - 0.0461538461538462, - 0.0461538461538462, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0307692307692308, - 0.0307692307692308, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0298507462686567, - 0.0285714285714286, - 0.0285714285714286, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0298507462686567, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0298507462686567, - 0.0298507462686567, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0303030303030303, - 0.0303030303030303, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0142857142857143, - 0.0142857142857143, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0140845070422535, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0135135135135135, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0333333333333333, - 0.0333333333333333, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0847457627118644, - 0.0847457627118644, - 0.0862068965517241, - 0.1034482758620690, - 0.1034482758620690, - 0.1034482758620690, - 0.1186440677966100, - 0.1186440677966100, - 0.1206896551724140, - 0.1206896551724140, - 0.1206896551724140, - 0.1206896551724140, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1833333333333330, - 0.1833333333333330, - 0.1833333333333330, - 0.1833333333333330, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.2096774193548390, - 0.2131147540983610, - 0.2258064516129030, - 0.2295081967213110, - 0.2295081967213110, - 0.2372881355932200, - 0.2542372881355930, - 0.2542372881355930, - 0.2586206896551720, - 0.2586206896551720, - 0.2631578947368420, - 0.2678571428571430, - 0.2678571428571430, - 0.2807017543859650, - 0.2807017543859650, - 0.2807017543859650, - 0.2807017543859650, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2857142857142860, - 0.2982456140350880, - 0.3103448275862070, - 0.3275862068965520, - 0.3389830508474580, - 0.3448275862068970, - 0.3684210526315790, - 0.3684210526315790, - 0.3859649122807020, - 0.3965517241379310, - 0.3965517241379310, - 0.3965517241379310, - 0.3965517241379310, - 0.3965517241379310, - 0.3898305084745760, - 0.3898305084745760, - 0.3898305084745760, - 0.3898305084745760, - 0.4000000000000000, - 0.4067796610169490, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4067796610169490, - 0.4067796610169490, - 0.4166666666666670, - 0.4333333333333330, - 0.4333333333333330, - 0.4406779661016950, - 0.4406779661016950, - 0.4406779661016950, - 0.4333333333333330, - 0.4262295081967210, - 0.4426229508196720, - 0.4736842105263160, - 0.4827586206896550, - 0.4915254237288140, - 0.5000000000000000, - 0.5084745762711860, - 0.5084745762711860, - 0.5172413793103450, - 0.5172413793103450, - 0.5172413793103450, - 0.5172413793103450, - 0.5344827586206900, - 0.5344827586206900, - 0.5636363636363640, - 0.5636363636363640, - 0.6037735849056600, - 0.6111111111111110, - 0.6000000000000000, - 0.6000000000000000, - 0.6111111111111110, - 0.6111111111111110, - 0.6111111111111110, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6181818181818180, - 0.6296296296296300, - 0.6296296296296300, - 0.6415094339622640, - 0.6666666666666670, - 0.6800000000000000, - 0.6938775510204080, - 0.7000000000000000, - 0.7000000000000000, - 0.7115384615384620, - 0.7115384615384620, - 0.7115384615384620, - 0.7169811320754720, - 0.7413793103448280, - 0.7413793103448280, - 0.7413793103448280, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7627118644067800, - 0.7627118644067800, - 0.7741935483870970, - 0.7741935483870970, - 0.7741935483870970, - 0.7868852459016390, - 0.7903225806451610, - 0.7903225806451610, - 0.7936507936507940, - 0.7936507936507940, - 0.7936507936507940, - 0.7936507936507940, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8125000000000000, - 0.8153846153846150, - 0.8153846153846150, - 0.8153846153846150, - 0.8153846153846150, - 0.8153846153846150, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8358208955223880, - 0.8382352941176470, - 0.8358208955223880, - 0.8507462686567160, - 0.8507462686567160, - 0.8507462686567160, - 0.8507462686567160, - 0.8507462686567160, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8550724637681160, - 0.8550724637681160, - 0.8550724637681160, - 0.8550724637681160, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8805970149253730, - 0.8805970149253730, - 0.8805970149253730, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8805970149253730, - 0.8939393939393940, - 0.8923076923076920, - 0.8923076923076920, - 0.8923076923076920, - 0.8787878787878790, - 0.8787878787878790, - 0.8656716417910450, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8550724637681160, - 0.8550724637681160, - 0.8550724637681160, - 0.8550724637681160, - 0.8550724637681160, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8529411764705880, - 0.8656716417910450, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8676470588235290, - 0.8550724637681160, - 0.8428571428571430, - 0.8428571428571430, - 0.8428571428571430, - 0.8428571428571430, - 0.8428571428571430, - 0.8428571428571430, - 0.8428571428571430, - 0.8428571428571430, - 0.8405797101449270, - 0.8405797101449270, - 0.8405797101449270, - 0.8285714285714290, - 0.8285714285714290, - 0.8285714285714290, - 0.8285714285714290, - 0.8285714285714290, - 0.8285714285714290, - 0.8235294117647060, - 0.8484848484848480, - 0.8461538461538460, - 0.8461538461538460, - 0.8461538461538460, - 0.8437500000000000, - 0.8181818181818180, - 0.8181818181818180, - 0.8181818181818180, - 0.8208955223880600, - 0.8208955223880600, - 0.8088235294117650, - 0.8088235294117650, - 0.8088235294117650, - 0.8088235294117650, - 0.8088235294117650, - 0.8088235294117650, - 0.8088235294117650, - 0.8088235294117650, - 0.7971014492753620, - 0.7826086956521740, - 0.7826086956521740, - 0.7794117647058820, - 0.7794117647058820, - 0.7910447761194030, - 0.8030303030303030, - 0.8030303030303030, - 0.8000000000000000, - 0.7878787878787880, - 0.7878787878787880, - 0.8000000000000000, - 0.7936507936507940, - 0.7777777777777780, - 0.7580645161290320, - 0.7500000000000000, - 0.7500000000000000, - 0.7457627118644070, - 0.7096774193548390, - 0.7166666666666670, - 0.7213114754098360, - 0.7213114754098360, - 0.7213114754098360, - 0.7213114754098360, - 0.7213114754098360, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7142857142857140, - 0.7142857142857140, - 0.6984126984126980, - 0.7031250000000000, - 0.7031250000000000, - 0.7031250000000000, - 0.7031250000000000, - 0.7031250000000000, - 0.7031250000000000, - 0.7031250000000000, - 0.7076923076923080, - 0.7076923076923080, - 0.7076923076923080, - 0.7076923076923080, - 0.7076923076923080, - 0.7031250000000000, - 0.7031250000000000, - 0.7031250000000000, - 0.6923076923076920, - 0.7031250000000000, - 0.6984126984126980, - 0.7031250000000000, - 0.6984126984126980, - 0.6984126984126980, - 0.7096774193548390, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6984126984126980, - 0.6935483870967740, - 0.6825396825396830, - 0.6825396825396830, - 0.6984126984126980, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7096774193548390, - 0.7213114754098360, - 0.7540983606557380, - 0.7540983606557380, - 0.7500000000000000, - 0.7500000000000000, - 0.7758620689655170, - 0.7931034482758620, - 0.8000000000000000, - 0.8000000000000000, - 0.8064516129032260, - 0.8196721311475410, - 0.8253968253968250, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8412698412698410, - 0.8437500000000000, - 0.8437500000000000, - 0.8437500000000000, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8524590163934430, - 0.8524590163934430, - 0.8500000000000000, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8500000000000000, - 0.8524590163934430, - 0.8524590163934430, - 0.8524590163934430, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8548387096774190, - 0.8412698412698410, - 0.8437500000000000, - 0.8437500000000000, - 0.8437500000000000, - 0.8307692307692310, - 0.8307692307692310, - 0.8307692307692310, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8281250000000000, - 0.8307692307692310, - 0.8307692307692310, - 0.8307692307692310, - 0.8307692307692310, - 0.8307692307692310, - 0.8307692307692310, - 0.8307692307692310, - 0.8181818181818180, - 0.8181818181818180, - 0.8153846153846150, - 0.8153846153846150, - 0.8281250000000000, - 0.8281250000000000, - 0.8225806451612900, - 0.8225806451612900, - 0.8095238095238100, - 0.8095238095238100, - 0.8225806451612900, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8360655737704920, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8500000000000000, - 0.8474576271186440, - 0.8500000000000000, - 0.8500000000000000, - 0.8333333333333330, - 0.8333333333333330, - 0.8500000000000000, - 0.8524590163934430, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8387096774193550, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8412698412698410, - 0.8387096774193550, - 0.8225806451612900, - 0.8225806451612900, - 0.8225806451612900, - 0.8225806451612900, - 0.8225806451612900, - 0.8253968253968250, - 0.8253968253968250, - 0.8253968253968250, - 0.8253968253968250, - 0.8253968253968250, - 0.8253968253968250, - 0.8253968253968250, - 0.8095238095238100, - 0.8225806451612900, - 0.8196721311475410, - 0.8166666666666670, - 0.8166666666666670, - 0.8166666666666670, - 0.8166666666666670, - 0.8166666666666670, - 0.8135593220338980, - 0.8135593220338980, - 0.7966101694915250, - 0.7868852459016390, - 0.7741935483870970, - 0.7741935483870970, - 0.7741935483870970, - 0.7741935483870970, - 0.7777777777777780, - 0.7777777777777780, - 0.7741935483870970, - 0.7741935483870970, - 0.7777777777777780, - 0.7741935483870970, - 0.7741935483870970, - 0.7868852459016390, - 0.7868852459016390, - 0.7741935483870970, - 0.7704918032786880, - 0.7580645161290320, - 0.7666666666666670, - 0.7540983606557380, - 0.7540983606557380, - 0.7540983606557380, - 0.7500000000000000, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7377049180327870, - 0.7258064516129030, - 0.7142857142857140, - 0.7096774193548390, - 0.7049180327868850, - 0.7049180327868850, - 0.7166666666666670, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7118644067796610, - 0.7241379310344830, - 0.7118644067796610, - 0.7000000000000000, - 0.6885245901639340, - 0.7000000000000000, - 0.7000000000000000, - 0.6949152542372880, - 0.6949152542372880, - 0.6949152542372880, - 0.6949152542372880, - 0.7068965517241380, - 0.6949152542372880, - 0.6896551724137930, - 0.7017543859649120, - 0.7017543859649120, - 0.7017543859649120, - 0.6779661016949150, - 0.6666666666666670, - 0.6610169491525420, - 0.6610169491525420, - 0.6610169491525420, - 0.6610169491525420, - 0.6500000000000000, - 0.6500000000000000, - 0.6440677966101690, - 0.6440677966101690, - 0.6428571428571430, - 0.6428571428571430, - 0.6428571428571430, - 0.6428571428571430, - 0.6315789473684210, - 0.6206896551724140, - 0.6206896551724140, - 0.6034482758620690, - 0.6034482758620690, - 0.6034482758620690, - 0.6034482758620690, - 0.6034482758620690, - 0.6140350877192980, - 0.6140350877192980, - 0.6071428571428570, - 0.6071428571428570, - 0.6071428571428570, - 0.5964912280701750, - 0.5862068965517240, - 0.5862068965517240, - 0.5862068965517240, - 0.5862068965517240, - 0.5964912280701750, - 0.6181818181818180, - 0.5964912280701750, - 0.5964912280701750, - 0.5964912280701750, - 0.5892857142857140, - 0.5689655172413790, - 0.5614035087719300, - 0.5614035087719300, - 0.5535714285714290, - 0.5555555555555560, - 0.5555555555555560, - 0.5555555555555560, - 0.5636363636363640, - 0.5636363636363640, - 0.5636363636363640, - 0.5636363636363640, - 0.5636363636363640, - 0.5636363636363640, - 0.5740740740740740, - 0.5740740740740740, - 0.5740740740740740, - 0.5740740740740740, - 0.5740740740740740, - 0.5576923076923080, - 0.5576923076923080, - 0.5490196078431370, - 0.5490196078431370, - 0.5600000000000000, - 0.5400000000000000, - 0.5400000000000000, - 0.5400000000000000, - 0.5400000000000000, - 0.5400000000000000, - 0.5400000000000000, - 0.5400000000000000, - 0.5192307692307690, - 0.5192307692307690, - 0.5192307692307690, - 0.4905660377358490, - 0.4905660377358490, - 0.4905660377358490, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.4814814814814810, - 0.4561403508771930, - 0.4561403508771930, - 0.4363636363636360, - 0.4363636363636360, - 0.4363636363636360, - 0.4259259259259260, - 0.3962264150943400, - 0.3962264150943400, - 0.3846153846153850, - 0.3846153846153850, - 0.3846153846153850, - 0.3921568627450980, - 0.3921568627450980, - 0.3773584905660380, - 0.3333333333333330, - 0.3148148148148150, - 0.3018867924528300, - 0.2962962962962960, - 0.3018867924528300, - 0.3018867924528300, - 0.3018867924528300, - 0.3018867924528300, - 0.3076923076923080, - 0.3137254901960780, - 0.3137254901960780, - 0.3137254901960780, - 0.2857142857142860, - 0.2857142857142860, - 0.2800000000000000, - 0.2745098039215690, - 0.2692307692307690, - 0.2745098039215690, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2549019607843140, - 0.2500000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1960784313725490, - 0.1923076923076920, - 0.1923076923076920, - 0.1923076923076920, - 0.1923076923076920, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1923076923076920, - 0.1923076923076920, - 0.1960784313725490, - 0.1960784313725490, - 0.1960784313725490, - 0.2000000000000000, - 0.1923076923076920, - 0.1960784313725490, - 0.1800000000000000, - 0.1800000000000000, - 0.1764705882352940, - 0.1800000000000000, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1698113207547170, - 0.1851851851851850, - 0.1851851851851850, - 0.1886792452830190, - 0.1851851851851850, - 0.1886792452830190, - 0.1886792452830190, - 0.1923076923076920, - 0.1923076923076920, - 0.1886792452830190, - 0.1886792452830190, - 0.1764705882352940, - 0.1600000000000000, - 0.1538461538461540, - 0.1481481481481480, - 0.1538461538461540, - 0.1538461538461540, - 0.1509433962264150, - 0.1346153846153850, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1153846153846150, - 0.1153846153846150, - 0.1176470588235290, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0925925925925926, - 0.0925925925925926, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0877192982456140, - 0.0877192982456140, - 0.0847457627118644, - 0.0819672131147541, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0727272727272727, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0166666666666667, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0166666666666667, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0322580645161290, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0491803278688525, - 0.0500000000000000, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1052631578947370, - 0.1052631578947370, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1111111111111110, - 0.1132075471698110, - 0.1153846153846150, - 0.1176470588235290, - 0.1176470588235290, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1509433962264150, - 0.1509433962264150, - 0.1666666666666670, - 0.1666666666666670, - 0.1818181818181820, - 0.1851851851851850, - 0.2280701754385960, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2413793103448280, - 0.2500000000000000, - 0.2545454545454540, - 0.2592592592592590, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2452830188679250, - 0.2592592592592590, - 0.2592592592592590, - 0.2592592592592590, - 0.2592592592592590, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2909090909090910, - 0.2909090909090910, - 0.2962962962962960, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3090909090909090, - 0.3148148148148150, - 0.3148148148148150, - 0.3148148148148150, - 0.3207547169811320, - 0.3333333333333330, - 0.3333333333333330, - 0.3396226415094340, - 0.3396226415094340, - 0.3518518518518520, - 0.3584905660377360, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3818181818181820, - 0.3818181818181820, - 0.4074074074074070, - 0.4074074074074070, - 0.4074074074074070, - 0.4074074074074070, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4259259259259260, - 0.4150943396226420, - 0.4230769230769230, - 0.4230769230769230, - 0.4230769230769230, - 0.4230769230769230, - 0.4313725490196080, - 0.4423076923076920, - 0.4509803921568630, - 0.4509803921568630, - 0.4509803921568630, - 0.4509803921568630, - 0.4693877551020410, - 0.4693877551020410, - 0.4791666666666670, - 0.4791666666666670, - 0.4791666666666670, - 0.4893617021276600, - 0.5000000000000000, - 0.5000000000000000, - 0.5111111111111110, - 0.5111111111111110, - 0.5217391304347830, - 0.5217391304347830, - 0.5217391304347830, - 0.5333333333333330, - 0.5581395348837210, - 0.5581395348837210, - 0.5681818181818180, - 0.5777777777777780, - 0.5652173913043480, - 0.5531914893617020, - 0.5777777777777780, - 0.5777777777777780, - 0.5909090909090910, - 0.6000000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.6250000000000000, - 0.6250000000000000, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6382978723404260, - 0.6521739130434780, - 0.6739130434782610, - 0.6888888888888890, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7083333333333330, - 0.7200000000000000, - 0.7346938775510200, - 0.7450980392156860, - 0.7450980392156860, - 0.7450980392156860, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7592592592592590, - 0.7454545454545450, - 0.7592592592592590, - 0.7592592592592590, - 0.7678571428571430, - 0.7678571428571430, - 0.7678571428571430, - 0.7543859649122810, - 0.7719298245614030, - 0.7719298245614030, - 0.7758620689655170, - 0.7758620689655170, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7796610169491530, - 0.7758620689655170, - 0.7758620689655170, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7894736842105260, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.7931034482758620, - 0.8070175438596490, - 0.8214285714285710, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8245614035087720, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8392857142857140, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8518518518518520, - 0.8518518518518520, - 0.8518518518518520, - 0.8363636363636360, - 0.8545454545454550, - 0.8571428571428570, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8571428571428570, - 0.8571428571428570, - 0.8545454545454550, - 0.8545454545454550, - 0.8545454545454550, - 0.8571428571428570, - 0.8596491228070170, - 0.8596491228070170, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8793103448275860, - 0.8771929824561400, - 0.8771929824561400, - 0.8793103448275860, - 0.8793103448275860, - 0.8793103448275860, - 0.8793103448275860, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8813559322033900, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8448275862068960, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8392857142857140, - 0.8333333333333330, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8301886792452830, - 0.8235294117647060, - 0.8235294117647060, - 0.8269230769230770, - 0.8269230769230770, - 0.8431372549019610, - 0.8431372549019610, - 0.8490566037735850, - 0.8490566037735850, - 0.8518518518518520, - 0.8518518518518520, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8571428571428570, - 0.8545454545454550, - 0.8545454545454550, - 0.8596491228070170, - 0.8596491228070170, - 0.8571428571428570, - 0.8571428571428570, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8545454545454550, - 0.8545454545454550, - 0.8518518518518520, - 0.8518518518518520, - 0.8545454545454550, - 0.8596491228070170, - 0.8596491228070170, - 0.8596491228070170, - 0.8620689655172410, - 0.8620689655172410, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8666666666666670, - 0.8813559322033900, - 0.8793103448275860, - 0.8793103448275860, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8793103448275860, - 0.8771929824561400, - 0.8771929824561400, - 0.8620689655172410, - 0.8644067796610170, - 0.8644067796610170, - 0.8644067796610170, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8771929824561400, - 0.8750000000000000, - 0.8771929824561400, - 0.8620689655172410, - 0.8620689655172410, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8474576271186440, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8750000000000000, - 0.8771929824561400, - 0.8771929824561400, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8620689655172410, - 0.8474576271186440, - 0.8474576271186440, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8448275862068960, - 0.8421052631578950, - 0.8421052631578950, - 0.8421052631578950, - 0.8448275862068960, - 0.8448275862068960, - 0.8571428571428570, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8727272727272730, - 0.8703703703703700, - 0.8867924528301890, - 0.8867924528301890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8888888888888890, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8703703703703700, - 0.8679245283018870, - 0.8679245283018870, - 0.8703703703703700, - 0.8518518518518520, - 0.8518518518518520, - 0.8518518518518520, - 0.8679245283018870, - 0.8679245283018870, - 0.8653846153846150, - 0.8653846153846150, - 0.8627450980392160, - 0.8600000000000000, - 0.8600000000000000, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8571428571428570, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8600000000000000, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8627450980392160, - 0.8600000000000000, - 0.8775510204081630, - 0.8750000000000000, - 0.8571428571428570, - 0.8400000000000000, - 0.8400000000000000, - 0.8400000000000000, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8235294117647060, - 0.8076923076923080, - 0.7924528301886790, - 0.7924528301886790, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7818181818181820, - 0.7857142857142860, - 0.7857142857142860, - 0.7857142857142860, - 0.7924528301886790, - 0.7924528301886790, - 0.7924528301886790, - 0.7924528301886790, - 0.7924528301886790, - 0.8076923076923080, - 0.7924528301886790, - 0.7924528301886790, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.7962962962962960, - 0.8113207547169810, - 0.7924528301886790, - 0.7924528301886790, - 0.7777777777777780, - 0.7777777777777780, - 0.7636363636363640, - 0.7500000000000000, - 0.7500000000000000, - 0.7500000000000000, - 0.7368421052631580, - 0.7368421052631580, - 0.7368421052631580, - 0.7368421052631580, - 0.7241379310344830, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7192982456140350, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7142857142857140, - 0.7090909090909090, - 0.7090909090909090, - 0.7090909090909090, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.6851851851851850, - 0.6909090909090910, - 0.6909090909090910, - 0.6909090909090910, - 0.6909090909090910, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.7037037037037040, - 0.6981132075471700, - 0.6981132075471700, - 0.6981132075471700, - 0.6923076923076920, - 0.6923076923076920, - 0.6923076923076920, - 0.6923076923076920, - 0.6923076923076920, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6792452830188680, - 0.6730769230769230, - 0.6730769230769230, - 0.6666666666666670, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6538461538461540, - 0.6666666666666670, - 0.6666666666666670, - 0.6666666666666670, - 0.6538461538461540, - 0.6470588235294120, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6346153846153850, - 0.6400000000000000, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6250000000000000, - 0.6326530612244900, - 0.6326530612244900, - 0.6326530612244900, - 0.6250000000000000, - 0.6000000000000000, - 0.6000000000000000, - 0.5882352941176470, - 0.5882352941176470, - 0.5800000000000000, - 0.5600000000000000, - 0.5714285714285710, - 0.5714285714285710, - 0.5714285714285710, - 0.5625000000000000, - 0.5625000000000000, - 0.5625000000000000, - 0.5510204081632650, - 0.5294117647058820, - 0.5294117647058820, - 0.5384615384615380, - 0.5384615384615380, - 0.5384615384615380, - 0.5384615384615380, - 0.5000000000000000, - 0.5000000000000000, - 0.4893617021276600, - 0.4791666666666670, - 0.4680851063829790, - 0.4782608695652170, - 0.4666666666666670, - 0.4666666666666670, - 0.4666666666666670, - 0.4666666666666670, - 0.4565217391304350, - 0.4565217391304350, - 0.4255319148936170, - 0.4130434782608700, - 0.3863636363636360, - 0.3777777777777780, - 0.3636363636363640, - 0.3636363636363640, - 0.3333333333333330, - 0.3488372093023260, - 0.3636363636363640, - 0.3636363636363640, - 0.3488372093023260, - 0.3409090909090910, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3181818181818180, - 0.3255813953488370, - 0.3095238095238100, - 0.3095238095238100, - 0.2926829268292680, - 0.2926829268292680, - 0.2857142857142860, - 0.2857142857142860, - 0.2790697674418600, - 0.2790697674418600, - 0.2727272727272730, - 0.2727272727272730, - 0.2790697674418600, - 0.2790697674418600, - 0.2790697674418600, - 0.2790697674418600, - 0.2790697674418600, - 0.2619047619047620, - 0.2558139534883720, - 0.2558139534883720, - 0.2380952380952380, - 0.2380952380952380, - 0.2272727272727270, - 0.2142857142857140, - 0.2045454545454550, - 0.2000000000000000, - 0.1777777777777780, - 0.1777777777777780, - 0.1702127659574470, - 0.1521739130434780, - 0.1458333333333330, - 0.1458333333333330, - 0.1600000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1568627450980390, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1372549019607840, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1132075471698110, - 0.1153846153846150, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1020408163265310, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1020408163265310, - 0.1020408163265310, - 0.1000000000000000, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1041666666666670, - 0.1041666666666670, - 0.1020408163265310, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0851063829787234, - 0.0851063829787234, - 0.0851063829787234, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0851063829787234, - 0.0851063829787234, - 0.0851063829787234, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0800000000000000, - 0.0784313725490196, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0754716981132075, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0588235294117647, - 0.0588235294117647, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0545454545454545, - 0.0535714285714286, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0363636363636364, - 0.0357142857142857, - 0.0357142857142857, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0370370370370370, - 0.0370370370370370, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0384615384615385, - 0.0392156862745098, - 0.0392156862745098, - 0.0400000000000000, - 0.0400000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0377358490566038, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0377358490566038, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0377358490566038, - 0.0377358490566038, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0185185185185185, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0175438596491228, - 0.0175438596491228, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000 - } - }, - { PLACE_CATEG_ID_OTHER, - { - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0181818181818182, - 0.0181818181818182, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0363636363636364, - 0.0363636363636364, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0526315789473684, - 0.0526315789473684, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0377358490566038, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0196078431372549, - 0.0196078431372549, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0192307692307692, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0188679245283019, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0192307692307692, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0192307692307692, - 0.0200000000000000, - 0.0200000000000000, - 0.0208333333333333, - 0.0212765957446808, - 0.0212765957446808, - 0.0212765957446808, - 0.0212765957446808, - 0.0416666666666667, - 0.0400000000000000, - 0.0392156862745098, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0392156862745098, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0384615384615385, - 0.0384615384615385, - 0.0400000000000000, - 0.0392156862745098, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0408163265306122, - 0.0425531914893617, - 0.0425531914893617, - 0.0425531914893617, - 0.0425531914893617, - 0.0444444444444444, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0425531914893617, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0444444444444444, - 0.0444444444444444, - 0.0444444444444444, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0444444444444444, - 0.0444444444444444, - 0.0465116279069768, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0444444444444444, - 0.0444444444444444, - 0.0444444444444444, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0408163265306122, - 0.0408163265306122, - 0.0400000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0377358490566038, - 0.0377358490566038, - 0.0384615384615385, - 0.0384615384615385, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0370370370370370, - 0.0370370370370370, - 0.0357142857142857, - 0.0357142857142857, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0333333333333333, - 0.0333333333333333, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0500000000000000, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0677966101694915, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0677966101694915, - 0.0677966101694915, - 0.0666666666666667, - 0.0666666666666667, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0655737704918033, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0517241379310345, - 0.0517241379310345, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0517241379310345, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0526315789473684, - 0.0526315789473684, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0727272727272727, - 0.0727272727272727, - 0.0740740740740741, - 0.0740740740740741, - 0.0909090909090909, - 0.0925925925925926, - 0.1090909090909090, - 0.1111111111111110, - 0.1132075471698110, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.0943396226415094, - 0.0943396226415094, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0909090909090909, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1228070175438600, - 0.1206896551724140, - 0.1206896551724140, - 0.1228070175438600, - 0.1071428571428570, - 0.1071428571428570, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.1052631578947370, - 0.1052631578947370, - 0.1052631578947370, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1250000000000000, - 0.0925925925925926, - 0.0925925925925926, - 0.1090909090909090, - 0.1071428571428570, - 0.1090909090909090, - 0.1090909090909090, - 0.1071428571428570, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0877192982456140, - 0.1071428571428570, - 0.1071428571428570, - 0.1228070175438600, - 0.1228070175438600, - 0.1250000000000000, - 0.1250000000000000, - 0.1071428571428570, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1250000000000000, - 0.1250000000000000, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1296296296296300, - 0.1272727272727270, - 0.1272727272727270, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1132075471698110, - 0.1153846153846150, - 0.1153846153846150, - 0.0980392156862745, - 0.1132075471698110, - 0.1153846153846150, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.1153846153846150, - 0.1176470588235290, - 0.1346153846153850, - 0.1346153846153850, - 0.1400000000000000, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1600000000000000, - 0.1836734693877550, - 0.1836734693877550, - 0.1836734693877550, - 0.1632653061224490, - 0.1632653061224490, - 0.1800000000000000, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1956521739130430, - 0.1956521739130430, - 0.1956521739130430, - 0.1956521739130430, - 0.2173913043478260, - 0.2173913043478260, - 0.2127659574468080, - 0.2127659574468080, - 0.2127659574468080, - 0.2040816326530610, - 0.2000000000000000, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1627906976744190, - 0.1627906976744190, - 0.1627906976744190, - 0.1428571428571430, - 0.1428571428571430, - 0.1463414634146340, - 0.1463414634146340, - 0.1860465116279070, - 0.1860465116279070, - 0.2045454545454550, - 0.2093023255813950, - 0.2093023255813950, - 0.2093023255813950, - 0.2272727272727270, - 0.2272727272727270, - 0.2608695652173910, - 0.2608695652173910, - 0.2444444444444440, - 0.2444444444444440, - 0.2954545454545450, - 0.2954545454545450, - 0.3404255319148940, - 0.3333333333333330, - 0.3265306122448980, - 0.3265306122448980, - 0.3200000000000000, - 0.3265306122448980, - 0.3400000000000000, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3269230769230770, - 0.3207547169811320, - 0.3396226415094340, - 0.3396226415094340, - 0.3333333333333330, - 0.3269230769230770, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3148148148148150, - 0.3148148148148150, - 0.3148148148148150, - 0.3090909090909090, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3272727272727270, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3214285714285710, - 0.3148148148148150, - 0.3148148148148150, - 0.3148148148148150, - 0.3148148148148150, - 0.3090909090909090, - 0.3148148148148150, - 0.2127659574468080, - 0.2127659574468080, - 0.2127659574468080, - 0.2127659574468080, - 0.2173913043478260, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1818181818181820, - 0.1818181818181820, - 0.1777777777777780, - 0.1777777777777780, - 0.1777777777777780, - 0.1777777777777780, - 0.1521739130434780, - 0.1521739130434780, - 0.1521739130434780, - 0.1304347826086960, - 0.1304347826086960, - 0.1304347826086960, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1250000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1632653061224490, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1800000000000000, - 0.1800000000000000, - 0.1800000000000000, - 0.1960784313725490, - 0.1960784313725490, - 0.1923076923076920, - 0.1923076923076920, - 0.1923076923076920, - 0.1886792452830190, - 0.1886792452830190, - 0.1730769230769230, - 0.1730769230769230, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1400000000000000, - 0.1400000000000000, - 0.1372549019607840, - 0.1372549019607840, - 0.1538461538461540, - 0.1538461538461540, - 0.1200000000000000, - 0.1200000000000000, - 0.1346153846153850, - 0.1372549019607840, - 0.1372549019607840, - 0.1200000000000000, - 0.0833333333333333, - 0.0833333333333333, - 0.0800000000000000, - 0.0800000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0784313725490196, - 0.0961538461538462, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1153846153846150, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0740740740740741, - 0.0740740740740741, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0862068965517241, - 0.0862068965517241, - 0.0701754385964912, - 0.0689655172413793, - 0.0677966101694915, - 0.0677966101694915, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0689655172413793, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0625000000000000, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0317460317460317, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0172413793103448, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228, - 0.0178571428571429, - 0.0181818181818182, - 0.0357142857142857, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0350877192982456, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0181818181818182, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0181818181818182, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0188679245283019, - 0.0188679245283019, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0181818181818182, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0185185185185185, - 0.0181818181818182, - 0.0185185185185185, - 0.0181818181818182, - 0.0181818181818182, - 0.0185185185185185, - 0.0185185185185185, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0192307692307692, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0200000000000000, - 0.0200000000000000, - 0.0200000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0392156862745098, - 0.0384615384615385, - 0.0566037735849057, - 0.0566037735849057, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0600000000000000, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0588235294117647, - 0.0588235294117647, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0384615384615385, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0392156862745098, - 0.0200000000000000, - 0.0408163265306122, - 0.0408163265306122, - 0.0408163265306122, - 0.0408163265306122, - 0.0416666666666667, - 0.0416666666666667, - 0.0425531914893617, - 0.0425531914893617, - 0.0425531914893617, - 0.0425531914893617, - 0.0425531914893617, - 0.0416666666666667, - 0.0625000000000000, - 0.0612244897959184, - 0.0612244897959184, - 0.0612244897959184, - 0.0600000000000000, - 0.0588235294117647, - 0.0588235294117647, - 0.0600000000000000, - 0.0600000000000000, - 0.0600000000000000, - 0.0638297872340425, - 0.0638297872340425, - 0.0434782608695652, - 0.0444444444444444, - 0.0444444444444444, - 0.0444444444444444, - 0.0444444444444444, - 0.0444444444444444, - 0.0227272727272727, - 0.0217391304347826, - 0.0212765957446808, - 0.0208333333333333, - 0.0204081632653061, - 0.0204081632653061, - 0.0200000000000000, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0196078431372549, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0350877192982456, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0322580645161290, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0312500000000000, - 0.0312500000000000, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0166666666666667, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0476190476190476, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0307692307692308, - 0.0307692307692308, - 0.0307692307692308, - 0.0312500000000000, - 0.0317460317460317, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0312500000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0158730158730159, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0163934426229508, - 0.0163934426229508, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0333333333333333, - 0.0344827586206897, - 0.0350877192982456, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0545454545454545, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0363636363636364, - 0.0370370370370370, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0333333333333333, - 0.0169491525423729, - 0.0169491525423729, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0172413793103448, - 0.0172413793103448, - 0.0175438596491228, - 0.0172413793103448, - 0.0172413793103448, - 0.0175438596491228, - 0.0000000000000000, - 0.0000000000000000, - 0.0169491525423729, - 0.0169491525423729, - 0.0172413793103448, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0163934426229508, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0169491525423729, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0163934426229508, - 0.0166666666666667, - 0.0166666666666667, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0156250000000000, - 0.0156250000000000, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0161290322580645, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0322580645161290, - 0.0322580645161290, - 0.0483870967741936, - 0.0468750000000000, - 0.0476190476190476, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0500000000000000, - 0.0491803278688525, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0327868852459016, - 0.0333333333333333, - 0.0169491525423729, - 0.0169491525423729, - 0.0333333333333333, - 0.0333333333333333, - 0.0645161290322581, - 0.0793650793650794, - 0.0781250000000000, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0781250000000000, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0781250000000000, - 0.0781250000000000, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0923076923076923, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0952380952380952, - 0.0967741935483871, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0847457627118644, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0877192982456140, - 0.0727272727272727, - 0.0892857142857143, - 0.0892857142857143, - 0.0909090909090909, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0576923076923077, - 0.0740740740740741, - 0.0740740740740741, - 0.0909090909090909, - 0.0909090909090909, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1206896551724140, - 0.1206896551724140, - 0.1228070175438600, - 0.1250000000000000, - 0.1090909090909090, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1111111111111110, - 0.1111111111111110, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.1000000000000000, - 0.0816326530612245, - 0.0816326530612245, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0816326530612245, - 0.0816326530612245, - 0.0816326530612245, - 0.0833333333333333, - 0.0833333333333333, - 0.1000000000000000, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1153846153846150, - 0.1111111111111110, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1052631578947370, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.1071428571428570, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0784313725490196, - 0.0769230769230769, - 0.0784313725490196, - 0.0784313725490196, - 0.0769230769230769, - 0.0784313725490196, - 0.0784313725490196, - 0.0784313725490196, - 0.0961538461538462, - 0.0961538461538462, - 0.1132075471698110, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1132075471698110, - 0.1111111111111110, - 0.1111111111111110, - 0.1454545454545450, - 0.1454545454545450, - 0.1538461538461540, - 0.1481481481481480, - 0.1481481481481480, - 0.1481481481481480, - 0.1538461538461540, - 0.1538461538461540, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1276595744680850, - 0.1304347826086960, - 0.1304347826086960, - 0.0888888888888889, - 0.0869565217391304, - 0.0851063829787234, - 0.1041666666666670, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1250000000000000, - 0.1250000000000000, - 0.1224489795918370, - 0.1041666666666670, - 0.1041666666666670, - 0.1041666666666670, - 0.1020408163265310, - 0.1041666666666670, - 0.1063829787234040, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1041666666666670, - 0.1041666666666670, - 0.1020408163265310, - 0.1020408163265310, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.1153846153846150, - 0.1153846153846150, - 0.1132075471698110, - 0.1132075471698110, - 0.1153846153846150, - 0.1153846153846150, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1698113207547170, - 0.1666666666666670, - 0.1509433962264150, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1818181818181820, - 0.1636363636363640, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1754385964912280, - 0.1754385964912280, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1864406779661020, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1833333333333330, - 0.1833333333333330, - 0.1833333333333330, - 0.1967213114754100, - 0.1935483870967740, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1774193548387100, - 0.1774193548387100, - 0.1774193548387100, - 0.1500000000000000, - 0.1500000000000000, - 0.1500000000000000, - 0.1500000000000000, - 0.1666666666666670, - 0.1525423728813560, - 0.1071428571428570, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1403508771929820, - 0.1403508771929820, - 0.1403508771929820, - 0.1403508771929820, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1724137931034480, - 0.1724137931034480, - 0.1694915254237290, - 0.1666666666666670, - 0.1639344262295080, - 0.1500000000000000, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1475409836065570, - 0.1475409836065570, - 0.1612903225806450, - 0.1612903225806450, - 0.1587301587301590, - 0.1692307692307690, - 0.1692307692307690, - 0.1692307692307690, - 0.1692307692307690, - 0.1562500000000000, - 0.1562500000000000, - 0.1562500000000000, - 0.1692307692307690, - 0.1692307692307690, - 0.1692307692307690, - 0.1692307692307690, - 0.1538461538461540, - 0.1538461538461540, - 0.1538461538461540, - 0.1538461538461540, - 0.1406250000000000, - 0.1290322580645160, - 0.1290322580645160, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0862068965517241, - 0.0862068965517241, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0781250000000000, - 0.0781250000000000, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0952380952380952, - 0.0793650793650794, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0597014925373134, - 0.0588235294117647, - 0.0588235294117647, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0285714285714286, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0156250000000000, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0153846153846154, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0491803278688525, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0169491525423729, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0161290322580645, - 0.0163934426229508, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0169491525423729, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0169491525423729, - 0.0166666666666667, - 0.0163934426229508, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0166666666666667, - 0.0169491525423729, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0163934426229508, - 0.0166666666666667, - 0.0172413793103448, - 0.0172413793103448, - 0.0172413793103448, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0181818181818182, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0178571428571429, - 0.0181818181818182, - 0.0185185185185185, - 0.0188679245283019, - 0.0188679245283019, - 0.0188679245283019, - 0.0192307692307692, - 0.0196078431372549, - 0.0204081632653061, - 0.0200000000000000, - 0.0200000000000000, - 0.0392156862745098, - 0.0400000000000000, - 0.0392156862745098, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0384615384615385, - 0.0392156862745098, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0566037735849057, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0535714285714286, - 0.0535714285714286, - 0.0526315789473684, - 0.0517241379310345, - 0.0545454545454545, - 0.0545454545454545, - 0.0363636363636364, - 0.0363636363636364, - 0.0357142857142857, - 0.0357142857142857, - 0.0363636363636364, - 0.0357142857142857, - 0.0357142857142857, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0370370370370370, - 0.0363636363636364, - 0.0363636363636364, - 0.0370370370370370, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0370370370370370, - 0.0392156862745098, - 0.0392156862745098, - 0.0400000000000000, - 0.0408163265306122, - 0.0408163265306122, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0384615384615385, - 0.0384615384615385, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0555555555555556, - 0.0555555555555556, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0312500000000000, - 0.0312500000000000, - 0.0307692307692308, - 0.0307692307692308, - 0.0312500000000000, - 0.0312500000000000, - 0.0307692307692308, - 0.0307692307692308, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0294117647058823, - 0.0289855072463768, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0285714285714286, - 0.0281690140845070, - 0.0285714285714286, - 0.0285714285714286, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0294117647058823, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0303030303030303, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0144927536231884, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0144927536231884, - 0.0147058823529412, - 0.0144927536231884, - 0.0147058823529412, - 0.0149253731343284, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0151515151515152, - 0.0156250000000000, - 0.0153846153846154, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0158730158730159, - 0.0461538461538462, - 0.0468750000000000, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0781250000000000, - 0.0781250000000000, - 0.0769230769230769, - 0.0769230769230769, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.1093750000000000, - 0.0967741935483871, - 0.0967741935483871, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0819672131147541, - 0.0666666666666667, - 0.0645161290322581, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0757575757575758, - 0.0724637681159420, - 0.0724637681159420, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0704225352112676, - 0.0704225352112676, - 0.0571428571428571, - 0.0579710144927536, - 0.0441176470588235, - 0.0441176470588235, - 0.0447761194029851, - 0.0454545454545455, - 0.0447761194029851, - 0.0441176470588235, - 0.0434782608695652, - 0.0428571428571429, - 0.0428571428571429, - 0.0434782608695652, - 0.0434782608695652, - 0.0434782608695652, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0294117647058823, - 0.0294117647058823, - 0.0298507462686567, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0289855072463768, - 0.0289855072463768, - 0.0285714285714286, - 0.0142857142857143, - 0.0142857142857143, - 0.0140845070422535, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0136986301369863, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0138888888888889, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0000000000000000, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0142857142857143, - 0.0281690140845070, - 0.0285714285714286, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0285714285714286, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0298507462686567, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0147058823529412, - 0.0147058823529412, - 0.0144927536231884, - 0.0147058823529412, - 0.0144927536231884, - 0.0142857142857143, - 0.0142857142857143, - 0.0140845070422535, - 0.0140845070422535, - 0.0142857142857143, - 0.0144927536231884, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0149253731343284, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0147058823529412, - 0.0289855072463768, - 0.0289855072463768, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0289855072463768, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0294117647058823, - 0.0298507462686567, - 0.0303030303030303, - 0.0447761194029851, - 0.0447761194029851, - 0.0454545454545455, - 0.0597014925373134, - 0.0597014925373134, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0441176470588235, - 0.0447761194029851, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0461538461538462, - 0.0461538461538462, - 0.0454545454545455, - 0.0454545454545455, - 0.0447761194029851, - 0.0447761194029851, - 0.0454545454545455, - 0.0468750000000000, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0476190476190476, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0491803278688525, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0491803278688525, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0526315789473684, - 0.0545454545454545, - 0.0526315789473684, - 0.0526315789473684, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0727272727272727, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0545454545454545, - 0.0555555555555556, - 0.0566037735849057, - 0.0384615384615385, - 0.0384615384615385, - 0.0384615384615385, - 0.0377358490566038, - 0.0377358490566038, - 0.0377358490566038, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0612244897959184, - 0.0625000000000000, - 0.0625000000000000, - 0.0612244897959184, - 0.0961538461538462, - 0.1111111111111110, - 0.1578947368421050, - 0.1551724137931030, - 0.1724137931034480, - 0.1694915254237290, - 0.1666666666666670, - 0.1666666666666670, - 0.2000000000000000, - 0.1864406779661020, - 0.1864406779661020, - 0.1864406779661020, - 0.1896551724137930, - 0.1896551724137930, - 0.2033898305084750, - 0.2033898305084750, - 0.2033898305084750, - 0.2000000000000000, - 0.1967213114754100, - 0.1967213114754100, - 0.1935483870967740, - 0.1935483870967740, - 0.2187500000000000, - 0.2187500000000000, - 0.2187500000000000, - 0.2187500000000000, - 0.2187500000000000, - 0.2307692307692310, - 0.2307692307692310, - 0.2380952380952380, - 0.2419354838709680, - 0.2459016393442620, - 0.2586206896551720, - 0.2586206896551720, - 0.2711864406779660, - 0.2711864406779660, - 0.2711864406779660, - 0.2711864406779660, - 0.2622950819672130, - 0.2580645161290320, - 0.2542372881355930, - 0.2542372881355930, - 0.2542372881355930, - 0.2500000000000000, - 0.2459016393442620, - 0.2459016393442620, - 0.2459016393442620, - 0.2459016393442620, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2622950819672130, - 0.2622950819672130, - 0.2622950819672130, - 0.2666666666666670, - 0.2711864406779660, - 0.2711864406779660, - 0.2833333333333330, - 0.2833333333333330, - 0.2786885245901640, - 0.2741935483870970, - 0.2615384615384620, - 0.2656250000000000, - 0.2539682539682540, - 0.2539682539682540, - 0.2539682539682540, - 0.2622950819672130, - 0.2666666666666670, - 0.2622950819672130, - 0.2500000000000000, - 0.2500000000000000, - 0.2459016393442620, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2500000000000000, - 0.2615384615384620, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2769230769230770, - 0.2769230769230770, - 0.2769230769230770, - 0.2727272727272730, - 0.2647058823529410, - 0.2647058823529410, - 0.2537313432835820, - 0.2647058823529410, - 0.2647058823529410, - 0.2647058823529410, - 0.2424242424242420, - 0.2424242424242420, - 0.2153846153846150, - 0.2153846153846150, - 0.2153846153846150, - 0.2153846153846150, - 0.1774193548387100, - 0.1774193548387100, - 0.1774193548387100, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1428571428571430, - 0.1428571428571430, - 0.1578947368421050, - 0.1428571428571430, - 0.1428571428571430, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1296296296296300, - 0.1296296296296300, - 0.1481481481481480, - 0.1481481481481480, - 0.1509433962264150, - 0.1666666666666670, - 0.1509433962264150, - 0.1886792452830190, - 0.2000000000000000, - 0.2037037037037040, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1929824561403510, - 0.1785714285714290, - 0.1818181818181820, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1724137931034480, - 0.1724137931034480, - 0.1694915254237290, - 0.1694915254237290, - 0.1666666666666670, - 0.1666666666666670, - 0.1500000000000000, - 0.1500000000000000, - 0.1500000000000000, - 0.1500000000000000, - 0.1525423728813560, - 0.1525423728813560, - 0.1379310344827590, - 0.1379310344827590, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1525423728813560, - 0.1525423728813560, - 0.1525423728813560, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1666666666666670, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1803278688524590, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.2000000000000000, - 0.2000000000000000, - 0.1969696969696970, - 0.1969696969696970, - 0.2000000000000000, - 0.2000000000000000, - 0.2121212121212120, - 0.2121212121212120, - 0.2238805970149250, - 0.2238805970149250, - 0.2238805970149250, - 0.2205882352941180, - 0.2205882352941180, - 0.2205882352941180, - 0.2205882352941180, - 0.2089552238805970, - 0.2058823529411760, - 0.2058823529411760, - 0.1940298507462690, - 0.1940298507462690, - 0.1940298507462690, - 0.1940298507462690, - 0.1940298507462690, - 0.1940298507462690, - 0.1884057971014490, - 0.1884057971014490, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1641791044776120, - 0.1641791044776120, - 0.1515151515151520, - 0.1492537313432840, - 0.1492537313432840, - 0.1470588235294120, - 0.1449275362318840, - 0.1449275362318840, - 0.1449275362318840, - 0.1449275362318840, - 0.1449275362318840, - 0.1449275362318840, - 0.1304347826086960, - 0.1323529411764710, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1343283582089550, - 0.1212121212121210, - 0.1230769230769230, - 0.1230769230769230, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1230769230769230, - 0.1230769230769230, - 0.1212121212121210, - 0.1212121212121210, - 0.1212121212121210, - 0.1212121212121210, - 0.1194029850746270, - 0.1142857142857140, - 0.1142857142857140, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1044776119402990, - 0.1060606060606060, - 0.1060606060606060, - 0.1060606060606060, - 0.1060606060606060, - 0.1060606060606060, - 0.1060606060606060, - 0.1044776119402990, - 0.1044776119402990, - 0.1014492753623190, - 0.1014492753623190, - 0.1014492753623190, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1060606060606060, - 0.1060606060606060, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.1076923076923080, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0857142857142857, - 0.0857142857142857, - 0.0845070422535211, - 0.0845070422535211, - 0.0845070422535211, - 0.0845070422535211, - 0.0845070422535211, - 0.0845070422535211, - 0.0845070422535211, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0704225352112676, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0694444444444444, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0563380281690141, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0547945205479452, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0540540540540541, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0405405405405405, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0410958904109589, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0416666666666667, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0422535211267606, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0428571428571429, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0454545454545455, - 0.0461538461538462, - 0.0461538461538462, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0468750000000000, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0317460317460317, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0333333333333333, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0333333333333333, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0327868852459016, - 0.0322580645161290, - 0.0327868852459016, - 0.0322580645161290, - 0.0327868852459016, - 0.0327868852459016, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0344827586206897, - 0.0344827586206897, - 0.0350877192982456, - 0.0357142857142857, - 0.0357142857142857, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0338983050847458, - 0.0344827586206897, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0333333333333333, - 0.0338983050847458, - 0.0338983050847458, - 0.0338983050847458, - 0.0333333333333333, - 0.0491803278688525, - 0.0491803278688525, - 0.0526315789473684, - 0.0517241379310345, - 0.0508474576271187, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0545454545454545, - 0.0545454545454545, - 0.0566037735849057, - 0.0555555555555556, - 0.0727272727272727, - 0.0727272727272727, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0740740740740741, - 0.0740740740740741, - 0.0754716981132075, - 0.0784313725490196, - 0.0600000000000000, - 0.0612244897959184, - 0.0600000000000000, - 0.0600000000000000, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0566037735849057, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0483870967741936, - 0.0483870967741936, - 0.0483870967741936, - 0.0491803278688525, - 0.0645161290322581, - 0.0645161290322581, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0634920634920635, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0606060606060606, - 0.0606060606060606, - 0.0606060606060606, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0588235294117647, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0597014925373134, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0441176470588235, - 0.0447761194029851, - 0.0447761194029851, - 0.0447761194029851, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0597014925373134, - 0.0454545454545455, - 0.0461538461538462, - 0.0461538461538462, - 0.0461538461538462, - 0.0606060606060606, - 0.0606060606060606, - 0.0597014925373134, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0724637681159420, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0735294117647059, - 0.0597014925373134, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0579710144927536, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0571428571428571, - 0.0579710144927536, - 0.0579710144927536, - 0.0579710144927536, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0735294117647059, - 0.0606060606060606, - 0.0615384615384615, - 0.0615384615384615, - 0.0615384615384615, - 0.0625000000000000, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1029411764705880, - 0.1014492753623190, - 0.1159420289855070, - 0.1159420289855070, - 0.1176470588235290, - 0.1176470588235290, - 0.1194029850746270, - 0.1060606060606060, - 0.1060606060606060, - 0.1076923076923080, - 0.1212121212121210, - 0.1212121212121210, - 0.1076923076923080, - 0.1111111111111110, - 0.1269841269841270, - 0.1451612903225810, - 0.1500000000000000, - 0.1500000000000000, - 0.1525423728813560, - 0.1935483870967740, - 0.2000000000000000, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.1967213114754100, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1904761904761900, - 0.1904761904761900, - 0.1904761904761900, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1846153846153850, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.2000000000000000, - 0.1875000000000000, - 0.1904761904761900, - 0.1875000000000000, - 0.1904761904761900, - 0.1904761904761900, - 0.1935483870967740, - 0.2063492063492060, - 0.2063492063492060, - 0.2063492063492060, - 0.2063492063492060, - 0.2096774193548390, - 0.2222222222222220, - 0.2222222222222220, - 0.2063492063492060, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1935483870967740, - 0.1803278688524590, - 0.1639344262295080, - 0.1639344262295080, - 0.1666666666666670, - 0.1666666666666670, - 0.1379310344827590, - 0.1206896551724140, - 0.1166666666666670, - 0.1166666666666670, - 0.1129032258064520, - 0.0983606557377049, - 0.0952380952380952, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0793650793650794, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0645161290322581, - 0.0793650793650794, - 0.0781250000000000, - 0.0781250000000000, - 0.0781250000000000, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0937500000000000, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.0923076923076923, - 0.1060606060606060, - 0.1060606060606060, - 0.1076923076923080, - 0.1076923076923080, - 0.0937500000000000, - 0.0937500000000000, - 0.0967741935483871, - 0.0967741935483871, - 0.1111111111111110, - 0.1111111111111110, - 0.0967741935483871, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0833333333333333, - 0.0833333333333333, - 0.1000000000000000, - 0.1000000000000000, - 0.0833333333333333, - 0.0819672131147541, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0806451612903226, - 0.0819672131147541, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0983606557377049, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0952380952380952, - 0.0952380952380952, - 0.0967741935483871, - 0.0967741935483871, - 0.0952380952380952, - 0.0967741935483871, - 0.0967741935483871, - 0.0819672131147541, - 0.0819672131147541, - 0.0967741935483871, - 0.0983606557377049, - 0.0967741935483871, - 0.1000000000000000, - 0.1147540983606560, - 0.0983606557377049, - 0.0983606557377049, - 0.1000000000000000, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0967741935483871, - 0.0952380952380952, - 0.0967741935483871, - 0.0983606557377049, - 0.0983606557377049, - 0.1000000000000000, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.1016949152542370, - 0.0862068965517241, - 0.0847457627118644, - 0.1000000000000000, - 0.1147540983606560, - 0.1166666666666670, - 0.1166666666666670, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1186440677966100, - 0.1206896551724140, - 0.1186440677966100, - 0.1206896551724140, - 0.1228070175438600, - 0.1228070175438600, - 0.1228070175438600, - 0.1525423728813560, - 0.1500000000000000, - 0.1525423728813560, - 0.1525423728813560, - 0.1525423728813560, - 0.1525423728813560, - 0.1666666666666670, - 0.1666666666666670, - 0.1694915254237290, - 0.1694915254237290, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1578947368421050, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1578947368421050, - 0.1578947368421050, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1754385964912280, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1754385964912280, - 0.1818181818181820, - 0.2105263157894740, - 0.2105263157894740, - 0.2105263157894740, - 0.2142857142857140, - 0.2068965517241380, - 0.2105263157894740, - 0.2105263157894740, - 0.2142857142857140, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2115384615384620, - 0.2115384615384620, - 0.2156862745098040, - 0.2156862745098040, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1800000000000000, - 0.1800000000000000, - 0.1923076923076920, - 0.1923076923076920, - 0.1923076923076920, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2456140350877190, - 0.2456140350877190, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2592592592592590, - 0.2641509433962260, - 0.2641509433962260, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2549019607843140, - 0.2549019607843140, - 0.2641509433962260, - 0.2777777777777780, - 0.2962962962962960, - 0.3018867924528300, - 0.3148148148148150, - 0.3018867924528300, - 0.3018867924528300, - 0.3018867924528300, - 0.3018867924528300, - 0.2884615384615380, - 0.2745098039215690, - 0.2745098039215690, - 0.2745098039215690, - 0.2857142857142860, - 0.2857142857142860, - 0.3000000000000000, - 0.3137254901960780, - 0.3076923076923080, - 0.3137254901960780, - 0.3200000000000000, - 0.3200000000000000, - 0.3200000000000000, - 0.3200000000000000, - 0.3137254901960780, - 0.3269230769230770, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3529411764705880, - 0.3461538461538460, - 0.3461538461538460, - 0.3269230769230770, - 0.3269230769230770, - 0.3333333333333330, - 0.3333333333333330, - 0.3137254901960780, - 0.3137254901960780, - 0.3076923076923080, - 0.2884615384615380, - 0.2745098039215690, - 0.2549019607843140, - 0.2549019607843140, - 0.2400000000000000, - 0.2500000000000000, - 0.2352941176470590, - 0.2400000000000000, - 0.2400000000000000, - 0.2352941176470590, - 0.2200000000000000, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2075471698113210, - 0.1851851851851850, - 0.1851851851851850, - 0.1698113207547170, - 0.1666666666666670, - 0.1698113207547170, - 0.1698113207547170, - 0.1538461538461540, - 0.1538461538461540, - 0.1509433962264150, - 0.1509433962264150, - 0.1568627450980390, - 0.1600000000000000, - 0.1730769230769230, - 0.1851851851851850, - 0.1538461538461540, - 0.1538461538461540, - 0.1698113207547170, - 0.1730769230769230, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1730769230769230, - 0.1730769230769230, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1851851851851850, - 0.1851851851851850, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.1851851851851850, - 0.2000000000000000, - 0.1851851851851850, - 0.1851851851851850, - 0.2105263157894740, - 0.2105263157894740, - 0.2372881355932200, - 0.2295081967213110, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2096774193548390, - 0.2096774193548390, - 0.2096774193548390, - 0.2063492063492060, - 0.2063492063492060, - 0.2096774193548390, - 0.2096774193548390, - 0.2222222222222220, - 0.2295081967213110, - 0.2295081967213110, - 0.2295081967213110, - 0.2166666666666670, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2419354838709680, - 0.2459016393442620, - 0.2622950819672130, - 0.2622950819672130, - 0.2500000000000000, - 0.2372881355932200, - 0.2372881355932200, - 0.2372881355932200, - 0.2372881355932200, - 0.2372881355932200, - 0.2000000000000000, - 0.2280701754385960, - 0.2280701754385960, - 0.2241379310344830, - 0.2241379310344830, - 0.2105263157894740, - 0.2105263157894740, - 0.2105263157894740, - 0.2105263157894740, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1964285714285710, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1754385964912280, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1403508771929820, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1379310344827590, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1694915254237290, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1774193548387100, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1746031746031750, - 0.1774193548387100, - 0.1774193548387100, - 0.1774193548387100, - 0.1774193548387100, - 0.1774193548387100, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1639344262295080, - 0.1639344262295080, - 0.1639344262295080, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1587301587301590, - 0.1639344262295080, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1612903225806450, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1500000000000000, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1475409836065570, - 0.1500000000000000, - 0.1475409836065570, - 0.1475409836065570, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1311475409836070, - 0.1311475409836070, - 0.1311475409836070, - 0.1311475409836070, - 0.1311475409836070, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1129032258064520, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1166666666666670, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1129032258064520, - 0.1129032258064520, - 0.1269841269841270, - 0.1269841269841270, - 0.1269841269841270, - 0.1269841269841270, - 0.1290322580645160, - 0.1290322580645160, - 0.1290322580645160, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1147540983606560, - 0.1000000000000000, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0983606557377049, - 0.0967741935483871, - 0.0967741935483871, - 0.0967741935483871, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0952380952380952, - 0.0937500000000000, - 0.0937500000000000, - 0.0923076923076923, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0895522388059701, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0746268656716418, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0757575757575758, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0769230769230769, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0793650793650794, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0806451612903226, - 0.0645161290322581, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0655737704918033, - 0.0666666666666667, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0655737704918033, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0877192982456140, - 0.0877192982456140, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0943396226415094, - 0.0961538461538462, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0925925925925926, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0892857142857143, - 0.0909090909090909, - 0.0925925925925926, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0943396226415094, - 0.0925925925925926, - 0.0925925925925926, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0943396226415094, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0925925925925926, - 0.0943396226415094, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0980392156862745, - 0.0961538461538462, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0816326530612245, - 0.0816326530612245, - 0.0833333333333333, - 0.0833333333333333, - 0.0833333333333333, - 0.0851063829787234, - 0.0652173913043478, - 0.0652173913043478, - 0.0666666666666667, - 0.0666666666666667, - 0.0652173913043478, - 0.0652173913043478, - 0.0652173913043478, - 0.0666666666666667, - 0.0697674418604651, - 0.0697674418604651, - 0.0681818181818182, - 0.0666666666666667, - 0.0869565217391304, - 0.1063829787234040, - 0.1111111111111110, - 0.1111111111111110, - 0.1136363636363640, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1041666666666670, - 0.1041666666666670, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1086956521739130, - 0.0869565217391304, - 0.0666666666666667, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0625000000000000, - 0.0600000000000000, - 0.0612244897959184, - 0.0588235294117647, - 0.0588235294117647, - 0.0588235294117647, - 0.0576923076923077, - 0.0576923076923077, - 0.0576923076923077, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0727272727272727, - 0.0740740740740741, - 0.0740740740740741, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0862068965517241, - 0.0862068965517241, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0862068965517241, - 0.0877192982456140, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0714285714285714, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0666666666666667, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0517241379310345, - 0.0526315789473684, - 0.0526315789473684, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0892857142857143, - 0.0925925925925926, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0961538461538462, - 0.0784313725490196, - 0.0784313725490196, - 0.0754716981132075, - 0.0754716981132075, - 0.0740740740740741, - 0.0740740740740741, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0535714285714286, - 0.0545454545454545, - 0.0545454545454545, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0535714285714286, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0545454545454545, - 0.0545454545454545, - 0.0555555555555556, - 0.0555555555555556, - 0.0545454545454545, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0517241379310345, - 0.0517241379310345, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0508474576271187, - 0.0508474576271187, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0500000000000000, - 0.0508474576271187, - 0.0517241379310345, - 0.0517241379310345, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0526315789473684, - 0.0517241379310345, - 0.0526315789473684, - 0.0526315789473684, - 0.0689655172413793, - 0.0677966101694915, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0714285714285714, - 0.0701754385964912, - 0.0862068965517241, - 0.0862068965517241, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0847457627118644, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0526315789473684, - 0.0526315789473684, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0517241379310345, - 0.0677966101694915, - 0.0677966101694915, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0689655172413793, - 0.0701754385964912, - 0.0701754385964912, - 0.0701754385964912, - 0.0689655172413793, - 0.0689655172413793, - 0.0714285714285714, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0555555555555556, - 0.0377358490566038, - 0.0377358490566038, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0370370370370370, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0566037735849057, - 0.0566037735849057, - 0.0555555555555556, - 0.0740740740740741, - 0.0740740740740741, - 0.0740740740740741, - 0.0566037735849057, - 0.0566037735849057, - 0.0576923076923077, - 0.0576923076923077, - 0.0588235294117647, - 0.0600000000000000, - 0.0600000000000000, - 0.0612244897959184, - 0.0408163265306122, - 0.0408163265306122, - 0.0408163265306122, - 0.0408163265306122, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0400000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0400000000000000, - 0.0204081632653061, - 0.0208333333333333, - 0.0204081632653061, - 0.0200000000000000, - 0.0200000000000000, - 0.0200000000000000, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0392156862745098, - 0.0384615384615385, - 0.0377358490566038, - 0.0377358490566038, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0545454545454545, - 0.0535714285714286, - 0.0535714285714286, - 0.0535714285714286, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0566037735849057, - 0.0576923076923077, - 0.0566037735849057, - 0.0566037735849057, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0555555555555556, - 0.0566037735849057, - 0.0754716981132075, - 0.0754716981132075, - 0.0740740740740741, - 0.0740740740740741, - 0.0727272727272727, - 0.0714285714285714, - 0.0714285714285714, - 0.0714285714285714, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0862068965517241, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0877192982456140, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0892857142857143, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.1111111111111110, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0943396226415094, - 0.0961538461538462, - 0.0961538461538462, - 0.0980392156862745, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.1153846153846150, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0980392156862745, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0800000000000000, - 0.0816326530612245, - 0.0816326530612245, - 0.0816326530612245, - 0.0816326530612245, - 0.0816326530612245, - 0.0833333333333333, - 0.0816326530612245, - 0.0816326530612245, - 0.0816326530612245, - 0.0833333333333333, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.1000000000000000, - 0.1200000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1428571428571430, - 0.1372549019607840, - 0.1372549019607840, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1458333333333330, - 0.1458333333333330, - 0.1489361702127660, - 0.1458333333333330, - 0.1489361702127660, - 0.1304347826086960, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1521739130434780, - 0.1521739130434780, - 0.1702127659574470, - 0.1739130434782610, - 0.1818181818181820, - 0.1777777777777780, - 0.1818181818181820, - 0.1818181818181820, - 0.1904761904761900, - 0.1860465116279070, - 0.1818181818181820, - 0.1818181818181820, - 0.1860465116279070, - 0.2045454545454550, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2272727272727270, - 0.2325581395348840, - 0.2380952380952380, - 0.2380952380952380, - 0.2195121951219510, - 0.2195121951219510, - 0.2142857142857140, - 0.2142857142857140, - 0.2093023255813950, - 0.2093023255813950, - 0.2045454545454550, - 0.2045454545454550, - 0.1860465116279070, - 0.1860465116279070, - 0.1860465116279070, - 0.1860465116279070, - 0.1860465116279070, - 0.1904761904761900, - 0.2093023255813950, - 0.2093023255813950, - 0.2142857142857140, - 0.2142857142857140, - 0.2272727272727270, - 0.2142857142857140, - 0.2045454545454550, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2127659574468080, - 0.2173913043478260, - 0.2291666666666670, - 0.2291666666666670, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2549019607843140, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2549019607843140, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2692307692307690, - 0.2745098039215690, - 0.2745098039215690, - 0.2745098039215690, - 0.2745098039215690, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2653061224489800, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2600000000000000, - 0.2448979591836730, - 0.2448979591836730, - 0.2400000000000000, - 0.2244897959183670, - 0.2244897959183670, - 0.2244897959183670, - 0.2244897959183670, - 0.2291666666666670, - 0.2291666666666670, - 0.2244897959183670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2127659574468080, - 0.2127659574468080, - 0.2127659574468080, - 0.2083333333333330, - 0.2083333333333330, - 0.2083333333333330, - 0.2127659574468080, - 0.2127659574468080, - 0.2127659574468080, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2600000000000000, - 0.2745098039215690, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2641509433962260, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2830188679245280, - 0.2641509433962260, - 0.2641509433962260, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2692307692307690, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2549019607843140, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2352941176470590, - 0.2352941176470590, - 0.2200000000000000, - 0.2200000000000000, - 0.2200000000000000, - 0.2156862745098040, - 0.2156862745098040, - 0.2156862745098040, - 0.2156862745098040, - 0.2156862745098040, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2115384615384620, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2181818181818180, - 0.2321428571428570, - 0.2363636363636360, - 0.2363636363636360, - 0.2363636363636360, - 0.2363636363636360, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2545454545454540, - 0.2678571428571430, - 0.2678571428571430, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2545454545454540, - 0.2407407407407410, - 0.2407407407407410, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2264150943396230, - 0.2307692307692310, - 0.2156862745098040, - 0.2156862745098040, - 0.2000000000000000, - 0.2000000000000000, - 0.1960784313725490, - 0.1960784313725490, - 0.2264150943396230, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2075471698113210, - 0.1960784313725490, - 0.1960784313725490, - 0.1960784313725490, - 0.1960784313725490, - 0.1960784313725490, - 0.1960784313725490, - 0.2075471698113210, - 0.2075471698113210, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2037037037037040, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2075471698113210, - 0.2037037037037040, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.2000000000000000, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1754385964912280, - 0.1754385964912280, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1481481481481480, - 0.1481481481481480, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1132075471698110, - 0.1132075471698110, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1454545454545450, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1090909090909090, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1132075471698110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1111111111111110, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1272727272727270, - 0.1296296296296300, - 0.1296296296296300, - 0.1296296296296300, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1320754716981130, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1176470588235290, - 0.1176470588235290, - 0.1176470588235290, - 0.1176470588235290, - 0.1176470588235290, - 0.1176470588235290, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1346153846153850, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1372549019607840, - 0.1200000000000000, - 0.1200000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1224489795918370, - 0.1041666666666670, - 0.1041666666666670, - 0.1041666666666670, - 0.1041666666666670, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1200000000000000, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1200000000000000, - 0.1372549019607840, - 0.1428571428571430, - 0.1458333333333330, - 0.1458333333333330, - 0.1489361702127660, - 0.1521739130434780, - 0.1521739130434780, - 0.1521739130434780, - 0.1702127659574470, - 0.1875000000000000, - 0.2040816326530610, - 0.2083333333333330, - 0.2083333333333330, - 0.2083333333333330, - 0.2083333333333330, - 0.2083333333333330, - 0.2127659574468080, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2340425531914890, - 0.2340425531914890, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2553191489361700, - 0.2553191489361700, - 0.2608695652173910, - 0.2608695652173910, - 0.2444444444444440, - 0.2272727272727270, - 0.2093023255813950, - 0.2045454545454550, - 0.2045454545454550, - 0.2045454545454550, - 0.2045454545454550, - 0.2045454545454550, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2391304347826090, - 0.2391304347826090, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2222222222222220, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2553191489361700, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2553191489361700, - 0.2553191489361700, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2391304347826090, - 0.2553191489361700, - 0.2553191489361700, - 0.2553191489361700, - 0.2444444444444440, - 0.2391304347826090, - 0.2340425531914890, - 0.2340425531914890, - 0.2500000000000000, - 0.2500000000000000, - 0.2653061224489800, - 0.2708333333333330, - 0.2765957446808510, - 0.2708333333333330, - 0.2857142857142860, - 0.2857142857142860, - 0.2553191489361700, - 0.2553191489361700, - 0.2608695652173910, - 0.2608695652173910, - 0.2608695652173910, - 0.2608695652173910, - 0.3061224489795920, - 0.2978723404255320, - 0.2978723404255320, - 0.2978723404255320, - 0.2978723404255320, - 0.3125000000000000, - 0.3125000000000000, - 0.3125000000000000, - 0.3125000000000000, - 0.3191489361702130, - 0.3191489361702130, - 0.3191489361702130, - 0.3191489361702130, - 0.2888888888888890, - 0.2826086956521740, - 0.2888888888888890, - 0.2727272727272730, - 0.2727272727272730, - 0.2790697674418600, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3191489361702130, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3191489361702130, - 0.3333333333333330, - 0.3333333333333330, - 0.3265306122448980, - 0.3333333333333330, - 0.3469387755102040, - 0.3600000000000000, - 0.3600000000000000, - 0.3469387755102040, - 0.3333333333333330, - 0.3333333333333330, - 0.3265306122448980, - 0.3061224489795920, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3137254901960780, - 0.3137254901960780, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.2916666666666670, - 0.2978723404255320, - 0.2978723404255320, - 0.3125000000000000, - 0.3125000000000000, - 0.3125000000000000, - 0.2978723404255320, - 0.2916666666666670, - 0.2916666666666670, - 0.3061224489795920, - 0.3061224489795920, - 0.2916666666666670, - 0.3061224489795920, - 0.3000000000000000, - 0.3000000000000000, - 0.3137254901960780, - 0.3269230769230770, - 0.3333333333333330, - 0.3269230769230770, - 0.3269230769230770, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3207547169811320, - 0.3269230769230770, - 0.3269230769230770, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3454545454545450, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3396226415094340, - 0.3396226415094340, - 0.3396226415094340, - 0.3396226415094340, - 0.3396226415094340, - 0.3461538461538460, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3518518518518520, - 0.3518518518518520, - 0.3518518518518520, - 0.3396226415094340, - 0.3269230769230770, - 0.3137254901960780, - 0.3137254901960780, - 0.3137254901960780, - 0.3269230769230770, - 0.3269230769230770, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3200000000000000, - 0.3061224489795920, - 0.3200000000000000, - 0.3137254901960780, - 0.3137254901960780, - 0.3137254901960780, - 0.3269230769230770, - 0.3269230769230770, - 0.3269230769230770, - 0.3269230769230770, - 0.3333333333333330, - 0.3333333333333330, - 0.3400000000000000, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3400000000000000, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3469387755102040, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3673469387755100, - 0.3800000000000000, - 0.3800000000000000, - 0.3800000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.3958333333333330, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4130434782608700, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4166666666666670, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4375000000000000, - 0.4468085106382980, - 0.4468085106382980, - 0.4468085106382980, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4565217391304350, - 0.4565217391304350, - 0.4565217391304350, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4444444444444440, - 0.4347826086956520, - 0.4347826086956520, - 0.4347826086956520, - 0.4255319148936170, - 0.4255319148936170, - 0.4255319148936170, - 0.4255319148936170, - 0.4255319148936170, - 0.4130434782608700, - 0.4130434782608700, - 0.4255319148936170, - 0.4255319148936170, - 0.4255319148936170, - 0.4255319148936170, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.4166666666666670, - 0.4166666666666670, - 0.4285714285714290, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4166666666666670, - 0.4200000000000000, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4081632653061220, - 0.4000000000000000, - 0.4117647058823530, - 0.4038461538461540, - 0.4150943396226420, - 0.4074074074074070, - 0.4074074074074070, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4038461538461540, - 0.3962264150943400, - 0.4038461538461540, - 0.4038461538461540, - 0.4038461538461540, - 0.4038461538461540, - 0.4038461538461540, - 0.3877551020408160, - 0.3921568627450980, - 0.3921568627450980, - 0.3800000000000000, - 0.3800000000000000, - 0.3800000000000000, - 0.3800000000000000, - 0.3725490196078430, - 0.3725490196078430, - 0.3725490196078430, - 0.3725490196078430, - 0.3846153846153850, - 0.3962264150943400, - 0.4038461538461540, - 0.4038461538461540, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4181818181818180, - 0.4181818181818180, - 0.4181818181818180, - 0.4181818181818180, - 0.4181818181818180, - 0.4074074074074070, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.4074074074074070, - 0.4074074074074070, - 0.4074074074074070, - 0.4000000000000000, - 0.4107142857142860, - 0.4107142857142860, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3928571428571430, - 0.3818181818181820, - 0.3818181818181820, - 0.3818181818181820, - 0.3818181818181820, - 0.3818181818181820, - 0.3703703703703700, - 0.3818181818181820, - 0.3818181818181820, - 0.3818181818181820, - 0.3888888888888890, - 0.3962264150943400, - 0.4074074074074070, - 0.4074074074074070, - 0.4000000000000000, - 0.4000000000000000, - 0.3888888888888890, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.4074074074074070, - 0.4000000000000000, - 0.3962264150943400, - 0.3846153846153850, - 0.3846153846153850, - 0.3725490196078430, - 0.3725490196078430, - 0.3653846153846150, - 0.3653846153846150, - 0.3773584905660380, - 0.3773584905660380, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3584905660377360, - 0.3773584905660380, - 0.3773584905660380, - 0.3653846153846150, - 0.3653846153846150, - 0.3653846153846150, - 0.3653846153846150, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3518518518518520, - 0.3518518518518520, - 0.3518518518518520, - 0.3518518518518520, - 0.3584905660377360, - 0.3584905660377360, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3518518518518520, - 0.3454545454545450, - 0.3454545454545450, - 0.3571428571428570, - 0.3571428571428570, - 0.3571428571428570, - 0.3571428571428570, - 0.3508771929824560, - 0.3508771929824560, - 0.3508771929824560, - 0.3508771929824560, - 0.3392857142857140, - 0.3333333333333330, - 0.3396226415094340, - 0.3461538461538460, - 0.3461538461538460, - 0.3461538461538460, - 0.3529411764705880, - 0.3653846153846150, - 0.3653846153846150, - 0.3653846153846150, - 0.3653846153846150, - 0.3653846153846150, - 0.3529411764705880, - 0.3529411764705880, - 0.3265306122448980, - 0.3265306122448980, - 0.3265306122448980, - 0.3265306122448980, - 0.3265306122448980, - 0.3333333333333330, - 0.3265306122448980, - 0.3265306122448980, - 0.3265306122448980, - 0.3333333333333330, - 0.3333333333333330, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3541666666666670, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3800000000000000, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3600000000000000, - 0.3600000000000000, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3653846153846150, - 0.3653846153846150, - 0.3800000000000000, - 0.3800000000000000, - 0.3800000000000000, - 0.3800000000000000, - 0.3800000000000000, - 0.3673469387755100, - 0.3469387755102040, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3469387755102040, - 0.3400000000000000, - 0.3400000000000000, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3529411764705880, - 0.3600000000000000, - 0.3600000000000000, - 0.3469387755102040, - 0.3469387755102040, - 0.3333333333333330, - 0.3333333333333330, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3469387755102040, - 0.3600000000000000, - 0.3725490196078430, - 0.3846153846153850, - 0.3846153846153850, - 0.3846153846153850, - 0.3846153846153850, - 0.3962264150943400, - 0.3962264150943400, - 0.4038461538461540, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.3962264150943400, - 0.4038461538461540, - 0.4259259259259260, - 0.4259259259259260, - 0.4259259259259260, - 0.4259259259259260, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4150943396226420, - 0.4000000000000000, - 0.3818181818181820, - 0.3818181818181820, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.3962264150943400, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.3888888888888890, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3888888888888890, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3703703703703700, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3584905660377360, - 0.3773584905660380, - 0.3773584905660380, - 0.3962264150943400, - 0.3962264150943400, - 0.3888888888888890, - 0.3818181818181820, - 0.3928571428571430, - 0.4035087719298250, - 0.4035087719298250, - 0.4035087719298250, - 0.4137931034482760, - 0.4137931034482760, - 0.4000000000000000, - 0.4000000000000000, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4210526315789470, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4210526315789470, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4107142857142860, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3888888888888890, - 0.3818181818181820, - 0.3818181818181820, - 0.3584905660377360, - 0.3584905660377360, - 0.3461538461538460, - 0.3461538461538460, - 0.3137254901960780, - 0.3000000000000000, - 0.3137254901960780, - 0.3137254901960780, - 0.3137254901960780, - 0.3137254901960780, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.3000000000000000, - 0.2800000000000000, - 0.2653061224489800, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.3076923076923080, - 0.2941176470588230, - 0.2941176470588230, - 0.2941176470588230, - 0.2941176470588230, - 0.2941176470588230, - 0.2941176470588230, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3207547169811320, - 0.3090909090909090, - 0.3090909090909090, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2962962962962960, - 0.2909090909090910, - 0.2777777777777780, - 0.2641509433962260, - 0.2777777777777780, - 0.2777777777777780, - 0.2727272727272730, - 0.2857142857142860, - 0.2807017543859650, - 0.2758620689655170, - 0.2758620689655170, - 0.2758620689655170, - 0.2758620689655170, - 0.2758620689655170, - 0.2631578947368420, - 0.2631578947368420, - 0.2631578947368420, - 0.2586206896551720, - 0.2456140350877190, - 0.2456140350877190, - 0.2456140350877190, - 0.2456140350877190, - 0.2321428571428570, - 0.2321428571428570, - 0.2321428571428570, - 0.2321428571428570, - 0.2280701754385960, - 0.2280701754385960, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2241379310344830, - 0.2280701754385960, - 0.2280701754385960, - 0.2280701754385960, - 0.2280701754385960, - 0.2280701754385960, - 0.2280701754385960, - 0.2280701754385960, - 0.2280701754385960, - 0.2142857142857140, - 0.2142857142857140, - 0.2068965517241380, - 0.2068965517241380, - 0.2068965517241380, - 0.2068965517241380, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1929824561403510, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1964285714285710, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1818181818181820, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1785714285714290, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1896551724137930, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1754385964912280, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1724137931034480, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1578947368421050, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1607142857142860, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1636363636363640, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1698113207547170, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1730769230769230, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1764705882352940, - 0.1600000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1600000000000000, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1568627450980390, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1063829787234040, - 0.1063829787234040, - 0.1063829787234040, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1400000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1333333333333330, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1777777777777780, - 0.1956521739130430, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2244897959183670, - 0.2244897959183670, - 0.2244897959183670, - 0.2244897959183670, - 0.2244897959183670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2653061224489800, - 0.2653061224489800, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2765957446808510, - 0.2916666666666670, - 0.2978723404255320, - 0.3125000000000000, - 0.3265306122448980, - 0.3265306122448980, - 0.3333333333333330, - 0.3191489361702130, - 0.3191489361702130, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3333333333333330, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3333333333333330, - 0.3260869565217390, - 0.3043478260869570, - 0.3043478260869570, - 0.2954545454545450, - 0.2954545454545450, - 0.2954545454545450, - 0.2790697674418600, - 0.2666666666666670, - 0.2666666666666670, - 0.2826086956521740, - 0.2826086956521740, - 0.2888888888888890, - 0.2888888888888890, - 0.2727272727272730, - 0.2558139534883720, - 0.2558139534883720, - 0.2558139534883720, - 0.2500000000000000, - 0.2666666666666670, - 0.2608695652173910, - 0.2608695652173910, - 0.2553191489361700, - 0.2553191489361700, - 0.2708333333333330, - 0.2500000000000000, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2448979591836730, - 0.2448979591836730, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2448979591836730, - 0.2448979591836730, - 0.2400000000000000, - 0.2400000000000000, - 0.2549019607843140, - 0.2549019607843140, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2400000000000000, - 0.2448979591836730, - 0.2448979591836730, - 0.2448979591836730, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2800000000000000, - 0.2653061224489800, - 0.2653061224489800, - 0.2800000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2448979591836730, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2553191489361700, - 0.2608695652173910, - 0.2608695652173910, - 0.2608695652173910, - 0.2608695652173910, - 0.2608695652173910, - 0.2553191489361700, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2708333333333330, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2653061224489800, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2800000000000000, - 0.2857142857142860, - 0.2916666666666670, - 0.2916666666666670, - 0.2916666666666670, - 0.2916666666666670, - 0.2916666666666670, - 0.2857142857142860, - 0.2916666666666670, - 0.2916666666666670, - 0.3061224489795920, - 0.3061224489795920, - 0.2978723404255320, - 0.2978723404255320, - 0.2826086956521740, - 0.2826086956521740, - 0.2727272727272730, - 0.2727272727272730, - 0.2888888888888890, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3191489361702130, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3111111111111110, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3181818181818180, - 0.3023255813953490, - 0.3023255813953490, - 0.2790697674418600, - 0.2857142857142860, - 0.3023255813953490, - 0.3023255813953490, - 0.3023255813953490, - 0.3181818181818180, - 0.3333333333333330, - 0.3617021276595740, - 0.3877551020408160, - 0.3877551020408160, - 0.4000000000000000, - 0.4000000000000000, - 0.4117647058823530, - 0.4117647058823530, - 0.4117647058823530, - 0.4117647058823530, - 0.4000000000000000, - 0.3877551020408160, - 0.3750000000000000, - 0.3750000000000000, - 0.3750000000000000, - 0.3750000000000000, - 0.3877551020408160, - 0.3877551020408160, - 0.3800000000000000, - 0.3800000000000000, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3673469387755100, - 0.3541666666666670, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3478260869565220, - 0.3478260869565220, - 0.3478260869565220, - 0.3404255319148940, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3260869565217390, - 0.3191489361702130, - 0.3191489361702130, - 0.3043478260869570, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2727272727272730, - 0.2888888888888890, - 0.2888888888888890, - 0.2826086956521740, - 0.2888888888888890, - 0.2888888888888890, - 0.3043478260869570, - 0.3191489361702130, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3409090909090910, - 0.3409090909090910, - 0.3409090909090910, - 0.3409090909090910, - 0.3409090909090910, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3333333333333330, - 0.3333333333333330, - 0.3333333333333330, - 0.3478260869565220, - 0.3478260869565220, - 0.3478260869565220, - 0.3555555555555560, - 0.3478260869565220, - 0.3478260869565220, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3478260869565220, - 0.3617021276595740, - 0.3617021276595740, - 0.3478260869565220, - 0.3478260869565220, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3404255319148940, - 0.3541666666666670, - 0.3541666666666670, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3617021276595740, - 0.3541666666666670, - 0.3600000000000000, - 0.3600000000000000, - 0.3600000000000000, - 0.3725490196078430, - 0.3725490196078430, - 0.3725490196078430, - 0.3800000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3877551020408160, - 0.3877551020408160, - 0.3877551020408160, - 0.3877551020408160, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.4000000000000000, - 0.3877551020408160, - 0.3877551020408160, - 0.3750000000000000, - 0.3750000000000000, - 0.3695652173913040, - 0.3695652173913040, - 0.3695652173913040, - 0.3695652173913040, - 0.3555555555555560, - 0.3555555555555560, - 0.3695652173913040, - 0.3695652173913040, - 0.3695652173913040, - 0.3695652173913040, - 0.3617021276595740, - 0.3695652173913040, - 0.3555555555555560, - 0.3409090909090910, - 0.3555555555555560, - 0.3555555555555560, - 0.3777777777777780, - 0.3863636363636360, - 0.3953488372093020, - 0.3953488372093020, - 0.3953488372093020, - 0.3953488372093020, - 0.3863636363636360, - 0.3863636363636360, - 0.3863636363636360, - 0.3863636363636360, - 0.3863636363636360, - 0.3863636363636360, - 0.3863636363636360, - 0.3863636363636360, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3636363636363640, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3777777777777780, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3409090909090910, - 0.3409090909090910, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3414634146341460, - 0.3170731707317070, - 0.3095238095238100, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3095238095238100, - 0.3095238095238100, - 0.3255813953488370, - 0.3255813953488370, - 0.3095238095238100, - 0.3095238095238100, - 0.3095238095238100, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3255813953488370, - 0.3095238095238100, - 0.3095238095238100, - 0.3255813953488370, - 0.3255813953488370, - 0.3409090909090910, - 0.3409090909090910, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3555555555555560, - 0.3409090909090910, - 0.3409090909090910, - 0.3488372093023260, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3829787234042550, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.3913043478260870, - 0.4042553191489360, - 0.4042553191489360, - 0.4042553191489360, - 0.3913043478260870, - 0.4000000000000000, - 0.4000000000000000, - 0.3863636363636360, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3636363636363640, - 0.3488372093023260, - 0.3488372093023260, - 0.3488372093023260, - 0.3409090909090910, - 0.3255813953488370, - 0.3255813953488370, - 0.3181818181818180, - 0.3181818181818180, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3260869565217390, - 0.3404255319148940, - 0.3404255319148940, - 0.3260869565217390, - 0.3023255813953490, - 0.3181818181818180, - 0.3111111111111110, - 0.3111111111111110, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3043478260869570, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3260869565217390, - 0.3260869565217390, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3111111111111110, - 0.3260869565217390, - 0.3111111111111110, - 0.3111111111111110, - 0.2954545454545450, - 0.2954545454545450, - 0.2954545454545450, - 0.2954545454545450, - 0.3260869565217390, - 0.3191489361702130, - 0.3191489361702130, - 0.3191489361702130, - 0.3191489361702130, - 0.3191489361702130, - 0.3125000000000000, - 0.3125000000000000, - 0.3125000000000000, - 0.3125000000000000, - 0.2978723404255320, - 0.2826086956521740, - 0.2826086956521740, - 0.2765957446808510, - 0.2978723404255320, - 0.2978723404255320, - 0.2916666666666670, - 0.2765957446808510, - 0.2765957446808510, - 0.2765957446808510, - 0.2765957446808510, - 0.2916666666666670, - 0.2916666666666670, - 0.3061224489795920, - 0.3061224489795920, - 0.3061224489795920, - 0.3061224489795920, - 0.2916666666666670, - 0.2916666666666670, - 0.2916666666666670, - 0.2916666666666670, - 0.2708333333333330, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2500000000000000, - 0.2340425531914890, - 0.2340425531914890, - 0.2173913043478260, - 0.2173913043478260, - 0.1956521739130430, - 0.1956521739130430, - 0.1956521739130430, - 0.1956521739130430, - 0.2173913043478260, - 0.2173913043478260, - 0.2000000000000000, - 0.2000000000000000, - 0.2173913043478260, - 0.2173913043478260, - 0.1956521739130430, - 0.1956521739130430, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2291666666666670, - 0.2244897959183670, - 0.2083333333333330, - 0.1914893617021280, - 0.1914893617021280, - 0.1875000000000000, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1914893617021280, - 0.1739130434782610, - 0.1702127659574470, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1836734693877550, - 0.1875000000000000, - 0.1914893617021280, - 0.1914893617021280, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1739130434782610, - 0.1777777777777780, - 0.1702127659574470, - 0.1702127659574470, - 0.1702127659574470, - 0.1702127659574470, - 0.1702127659574470, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1875000000000000, - 0.1836734693877550, - 0.1836734693877550, - 0.1666666666666670, - 0.1666666666666670, - 0.1666666666666670, - 0.1458333333333330, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1428571428571430, - 0.1458333333333330, - 0.1458333333333330, - 0.1458333333333330, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1276595744680850, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1250000000000000, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1224489795918370, - 0.1041666666666670, - 0.1041666666666670, - 0.1041666666666670, - 0.1041666666666670, - 0.1041666666666670, - 0.1020408163265310, - 0.1020408163265310, - 0.1020408163265310, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1020408163265310, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0980392156862745, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0800000000000000, - 0.0816326530612245, - 0.1000000000000000, - 0.1000000000000000, - 0.0980392156862745, - 0.0980392156862745, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0961538461538462, - 0.0943396226415094, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0909090909090909, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0925925925925926, - 0.0909090909090909, - 0.0740740740740741, - 0.0727272727272727, - 0.0727272727272727, - 0.0727272727272727, - 0.0714285714285714, - 0.0545454545454545, - 0.0545454545454545, - 0.0535714285714286, - 0.0535714285714286, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0363636363636364, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0357142857142857, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0350877192982456, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0344827586206897, - 0.0175438596491228, - 0.0175438596491228, - 0.0175438596491228 - } - } - }; - -} /* namespace prob_features */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_FEATURES_MODEL_H_ */ diff --git a/src/place/recognition/user_places/similarity.h b/src/place/recognition/user_places/similarity.h deleted file mode 100644 index 5938ef5..0000000 --- a/src/place/recognition/user_places/similarity.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_SIMILAR_H_ -#define _CONTEXT_PLACE_RECOGNITION_SIMILAR_H_ - -#include "user_places_types.h" - -namespace ctx { - -namespace similarity { - - template ctx::share_t overlap1stOver2nd(const T &s1, const T &s2) - { - if (s2.empty()) { - return 0; - } - int count = 0; - for (auto e : s2) { - if (s1.find(e) != s1.end()) { - count++; - } - } - return (ctx::share_t) count / s2.size(); - } - - template ctx::share_t overlapBiggerOverSmaller(const T &s1, const T &s2) - { - if (s1.size() > s2.size()) { - return similarity::overlap1stOver2nd(s1, s2); - } else { - return similarity::overlap1stOver2nd(s2, s1); - } - } - - template bool isJoint(const T &s1, const T &s2) - { - for (auto e : s2) { - if (s1.find(e) != s1.end()) { - return true; - } - } - return false; - } - -} /* namespace similarity */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_SIMILAR_H_ */ diff --git a/src/place/recognition/user_places/user_places.cpp b/src/place/recognition/user_places/user_places.cpp deleted file mode 100644 index ca237ea..0000000 --- a/src/place/recognition/user_places/user_places.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "user_places.h" -#include "places_detector.h" -#include "../place_recognition_types.h" - -ctx::UserPlaces::UserPlaces(PlaceRecogMode energyMode): - __visitDetector(nullptr), - __placesDetector(nullptr), - __placesDetectorTimerId(-1) -{ - time_t now = std::time(nullptr); - __visitDetector = new(std::nothrow) VisitDetector(now, energyMode); - if (__visitDetector == nullptr) { - _E("Cannot initialize __visitDetector"); - return; - } - - __placesDetector = new(std::nothrow) PlacesDetector(); - if (__placesDetector == nullptr) { - _E("Cannot initialize __placesDetector"); - return; - } - - __placesDetectorTimerId = __timerManager.setAt( // execute once every night - PLACES_DETECTOR_TASK_START_HOUR, - PLACES_DETECTOR_TASK_START_MINUTE, - DayOfWeek::EVERYDAY, - __placesDetector); - if (__placesDetectorTimerId < 0) { - _E("PlacesDetector timer set FAIL"); - return; - } else { - _D("PlacesDetector timer set SUCCESS"); - } -} - -ctx::UserPlaces::~UserPlaces() -{ - if (__placesDetectorTimerId >= 0) { - __timerManager.remove(__placesDetectorTimerId); - _D("PlacesDetector timer removed"); - } - - if (__visitDetector) { - delete __visitDetector; - } - - if (__placesDetector) { - delete __placesDetector; - } -}; - -std::vector> ctx::UserPlaces::getPlaces() -{ - if (__placesDetector) { - return __placesDetector->getPlaces(); - } else { - return std::vector>(); - } -} - -/* - * Example JSON output: - * ------------------------------------------------ - * { - * "PlacesList": [ - * { - * "TypeId": 2, - * "Name": "Work", - * "GeoLatitude": 10.94433, - * "GeoLongitude": 50.85504, - * "WifiAPs": "00:1f:f3:5b:2b:1f,15:34:56:78:9a:ba,13:34:56:78:9a:ba", - * "CreateDate": 12132567 - * }, - * { - * "TypeId": 1, - * "Name": "Home", - * "GeoLatitude": 10.96233, - * "GeoLongitude": 50.84304, - * "WifiAPs": "aa:bb:cc:dd:ee:ff,10:34:56:78:9a:bc", - * "CreateDate": 12132889 - * }, - * { - * "TypeId": 3, - * "Name": "Other", - * "GeoLatitude": 10.96553, - * "GeoLongitude": 50.80404, - * "WifiAPs": "12:34:56:78:9a:ba", - * "CreateDate": 12132346 - * } - * ] - * } - */ -ctx::Json ctx::UserPlaces::composeJson(std::vector> places) -{ - ctx::Json data; - for (std::shared_ptr place : places) { - ctx::Json placeJson; - placeJson.set(NULL, PLACE_CATEG_ID, place->categId); - placeJson.set(NULL, PLACE_CATEG_CONFIDENCE, place->categConfidence); - placeJson.set(NULL, PLACE_NAME, place->name); - if (place->locationValid) { - placeJson.set(NULL, PLACE_GEO_LATITUDE, place->location.latitude); - placeJson.set(NULL, PLACE_GEO_LONGITUDE, place->location.longitude); - } - placeJson.set(NULL, PLACE_WIFI_APS, place->wifiAps); - placeJson.set(NULL, PLACE_CREATE_DATE, static_cast(place->createDate)); - data.append(NULL, DATA_READ, placeJson); - } - return data; -} - -void ctx::UserPlaces::setMode(PlaceRecogMode energyMode) -{ - if (__visitDetector) { - __visitDetector->setMode(energyMode); - } -} diff --git a/src/place/recognition/user_places/user_places.h b/src/place/recognition/user_places/user_places.h deleted file mode 100644 index 1df6388..0000000 --- a/src/place/recognition/user_places/user_places.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_USER_PLACES_H_ -#define _CONTEXT_PLACE_RECOGNITION_USER_PLACES_H_ - -#include -#include -#include -#include "visit_detector.h" -#include "places_detector.h" -#include "user_places_types.h" - -namespace ctx { - - class UserPlaces { - - private: - VisitDetector *__visitDetector; - PlacesDetector *__placesDetector; - int __placesDetectorTimerId; - TimerManager __timerManager; - - public: - UserPlaces(PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE); - ~UserPlaces(); - - void setMode(PlaceRecogMode energyMode); - std::vector> getPlaces(); - static Json composeJson(std::vector> places); - - }; /* class UserPlaces */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_USER_PLACES_H_ */ diff --git a/src/place/recognition/user_places/user_places_params.h b/src/place/recognition/user_places/user_places_params.h deleted file mode 100644 index ec70a29..0000000 --- a/src/place/recognition/user_places/user_places_params.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_USER_PLACES_PARAMS_H_ -#define _CONTEXT_PLACE_RECOGNITION_USER_PLACES_PARAMS_H_ - -/* - * WiFi scanning frequency (in minutes) in PLACE_RECOG_HIGH_ACCURACY_MODE. - */ -#define WIFI_LOGGER_INTERVAL_MINUTES_HIGH_ACCURACY 3 - -/* - * WiFi scanning frequency (in minutes) in PLACE_RECOG_LOW_POWER_MODE. - */ -#define WIFI_LOGGER_INTERVAL_MINUTES_LOW_POWER 60 - -/* - * Time window taken into consideration (in seconds) in PLACE_RECOG_HIGH_ACCURACY_MODE. - */ -#define VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY 360 - -/* - * Time window taken into consideration (in seconds) in PLACE_RECOG_LOW_POWER_MODE. - */ -#define VISIT_DETECTOR_PERIOD_SECONDS_LOW_POWER 3600 - -/* - * Overlap threshold between two sets of mac addresses (overlap - * coefficient for two sets should be higher than this threshold - * in order to detect stable radio environment); =< 1.0 - * New parameter in algorithm compared to original version of PlaceSense! - */ -#define VISIT_DETECTOR_OVERLAP 0.8f - -/* - * Specifies how many stable intervals must be seen to - * indicate an entrance to a place; >= 1 - */ -#define VISIT_DETECTOR_STABLE_DEPTH 1 - -/* - * Representatives threshold (representatnive beacon - * response rate should be higher than this threshold); =< 1.0 - */ -#define VISIT_DETECTOR_REP_THRESHOLD 0.9f - -/* - * Specifies how long scans must be unstable to indicate a leave form a place; >= 1 - */ -#define VISIT_DETECTOR_TOLERANCE_DEPTH 3 - -#define PLACES_DETECTOR_TASK_START_HOUR 3 -#define PLACES_DETECTOR_TASK_START_MINUTE 11 -#define PLACES_DETECTOR_RETENTION_DAYS 30 -#define PLACES_DETECTOR_RETENTION_SECONDS 24 * 60 * 60 * PLACES_DETECTOR_RETENTION_DAYS - -/* - * Number of digits after decimal point used in geo coordinates. - */ -#define GEO_LOCATION_PRECISION 7 - -/* - * Minimal duration of visit (in minutes) taking into account for place detection - */ -#define PLACES_DETECTOR_MIN_VISIT_DURATION_MINUTES 15 - -/* - * Maximum duration of visit (in minutes) taking into account for place detection - */ -#define PLACES_DETECTOR_MAX_VISIT_DURATION_MINUTES 5 * 24 * 60 - -/* - * Minimum visits number per place - */ -#define PLACES_DETECTOR_MIN_VISITS_PER_PLACE 1 - -/* - * Minimum visits number per big place - */ -#define PLACES_DETECTOR_MIN_VISITS_PER_BIG_PLACE 4 - -/* - * Minimal visit category score for taking this visit into consideration during - * place categorization - */ -#define PLACES_CATEGER_MIN_VISITS_SCORE 0.1 - -/* - * Minimum visits number per home - */ -#define PLACES_CATEGER_MIN_VISITS_PER_HOME 3 - -/* - * Minimum visits number per work - */ -#define PLACES_CATEGER_MIN_VISITS_PER_WORK 2 - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_USER_PLACES_PARAMS_H_ */ diff --git a/src/place/recognition/user_places/user_places_types.cpp b/src/place/recognition/user_places/user_places_types.cpp deleted file mode 100644 index 14b1355..0000000 --- a/src/place/recognition/user_places/user_places_types.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include -#include -#include -#include "user_places_types.h" -#include "user_places_params.h" -#include "debug_utils.h" - -#define __MAC_STRING_COMPONENTS_SEPARATOR ':' -#define __MAC_SET_STRING_DELIMITER ',' - -ctx::Mac::Mac(const std::string& str) -{ - std::stringstream ss(str); - try { - ss >> *this; - } catch (std::runtime_error &e) { - _E("%s", e.what()); - } -} - -ctx::Mac::Mac(const char *str) -{ - std::stringstream ss(str); - try { - ss >> *this; - } catch (std::runtime_error &e) { - _E("%s", e.what()); - } -} - -std::istream& ctx::operator>>(std::istream &input, ctx::Mac &mac) -{ - int h; - char colon; - for (size_t i = 0; i < ctx::Mac::MAC_SIZE; i++) { - input >> std::hex; - input >> h; - mac.c[i] = h; - if (i + 1 >= ctx::Mac::MAC_SIZE) { - break; - } - input >> colon; - if (colon != __MAC_STRING_COMPONENTS_SEPARATOR) { - throw std::runtime_error("Invalid MAC format"); - } - } - input >> std::dec; - return input; -} - -std::ostream& ctx::operator<<(std::ostream &output, const ctx::Mac &mac) -{ - size_t i = 0; - while (true) { - output << std::hex << std::setfill('0') << std::setw(2); - output << static_cast(mac.c[i]); - i++; - if (i >= Mac::MAC_SIZE) { - break; - } - output << __MAC_STRING_COMPONENTS_SEPARATOR; - } - output << std::dec; - return output; -} - -ctx::Mac::operator std::string() const -{ - std::stringstream ss; - ss << *this; - return ss.str(); -} - -bool ctx::operator==(const Mac &m1, const Mac &m2) -{ - for (size_t i = 0; i < Mac::MAC_SIZE; i++) { - if (m1.c[i] != m2.c[i]) { - return false; - } - } - return true; -} - -bool ctx::operator!=(const Mac &m1, const Mac &m2) -{ - return !(m1 == m2); -} - -bool ctx::operator<(const Mac &m1, const Mac &m2) -{ - unsigned char c1, c2; - for (size_t i = 0; i < Mac::MAC_SIZE; i++) { - c1 = m1.c[i]; - c2 = m2.c[i]; - if (c1 < c2) { - return true; - } - if (c1 > c2) { - return false; - } - } - return false; // they are equal -} - -std::istream& ctx::operator>>(std::istream &input, ctx::MacSet &macSet) -{ - Mac mac; - char delimeter; - while (!input.eof()) { - try { - input >> mac; - } catch (std::runtime_error &e) { - _E("Cannot read macSet. Exception: %s", e.what()); - break; - } - macSet.insert(mac); - if (input.eof()) { - break; - } - delimeter = input.get(); - if (delimeter != __MAC_SET_STRING_DELIMITER) { - input.unget(); - break; - } - } - return input; -} - -std::ostream& ctx::operator<<(std::ostream &output, const ctx::MacSet &macSet) -{ - std::vector macVec(macSet.size()); - std::copy(macSet.begin(), macSet.end(), macVec.begin()); - std::sort(macVec.begin(), macVec.end()); - - bool first = true; - for (auto &mac: macVec) { - if (first) { - first = false; - } else { - output << __MAC_SET_STRING_DELIMITER; - } - output << mac; - } - return output; -} - -void ctx::LocationEvent::log() -{ - std::string time_str = DebugUtils::humanReadableDateTime(timestamp, "%T", 9); -#ifdef TIZEN_ENGINEER_MODE - _D("location lat=%.8f, lon=%.8f, acc=%.2f[m], time=%s, method=%d", - coordinates.latitude, - coordinates.longitude, - coordinates.accuracy, - time_str.c_str(), - method); -#else /* TIZEN_ENGINEER_MODE */ - _D("location lat=%.8f, lon=%.8f, acc=%.2f[m], time=%s", - coordinates.latitude, - coordinates.longitude, - coordinates.accuracy, - time_str.c_str()); -#endif /* TIZEN_ENGINEER_MODE */ -} - -void ctx::Visit::setLocation(Location location_) -{ - locationValid = true; - location = location_; -} - -void ctx::Visit::printShort2Stream(std::ostream &out) const -{ - // print only valid visits - if (interval.end != 0) { - float duration = ((float) (interval.end - interval.start)) / 3600; // [h] - out << "__VISIT " << duration << "h: "; - out << DebugUtils::humanReadableDateTime(interval.start, "%m/%d %H:%M", 15) << " ÷ "; - out << DebugUtils::humanReadableDateTime(interval.end, "%m/%d %H:%M", 15) << std::endl; - } -} - -bool ctx::operator==(const ctx::Visit &v1, const ctx::Visit &v2) -{ - return v1.interval.start == v2.interval.start - && v1.interval.end == v2.interval.end - && v1.categs == v2.categs - && v1.location.latitude == v2.location.latitude - && v1.location.longitude == v2.location.longitude - && v1.location.accuracy == v2.location.accuracy - && v1.locationValid == v2.locationValid - && v1.macSet == v2.macSet; -} - -ctx::MacSet ctx::macSetFromString(const std::string &str) -{ - MacSet macSet; - std::stringstream ss; - ss << str; - ss >> macSet; - return macSet; -} - -bool ctx::operator>(const Mac &m1, const Mac &m2) -{ - return m2 < m1; -} - -std::shared_ptr ctx::macSetFromMacs2Counts(const Macs2Counts &macs2Counts) -{ - std::shared_ptr macSet(std::make_shared()); - for (auto &macCount: macs2Counts) { - macSet->insert(macCount.first); - } - return macSet; -} - -std::shared_ptr ctx::macSetsUnion(const std::vector> &macSets) -{ - std::shared_ptr unionSet = std::make_shared(); - for (std::shared_ptr macSet : macSets) { - unionSet->insert(macSet->begin(), macSet->end()); - } - return unionSet; -} - -ctx::Interval::Interval(time_t start_, time_t end_) : start(start_), end(end_) { - if (end_ < start_) { - _E("Negative interval, start=%d, end=%d", start_, end_); - } -} - -void ctx::Place::print2Stream(std::ostream &out) const -{ - out << "PLACE:" << std::endl; - out << "__CATEGORY: " << name << std::endl; - if (locationValid) { - out << "__LOCATION: lat=" << std::setprecision(GEO_LOCATION_PRECISION + 2) << location.latitude; - out << ", lon=" << location.longitude << std::setprecision(5) << std::endl; - } - out << "__WIFI:" << wifiAps << std::endl; - out << "__CREATE_DATE: " << DebugUtils::humanReadableDateTime(createDate, "%F %T", 80) << std::endl; -} diff --git a/src/place/recognition/user_places/user_places_types.h b/src/place/recognition/user_places/user_places_types.h deleted file mode 100644 index cdf7be4..0000000 --- a/src/place/recognition/user_places/user_places_types.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_USER_PLACES_TYPES_H_ -#define _CONTEXT_PLACE_RECOGNITION_USER_PLACES_TYPES_H_ - -#include -#include -#include -#include -#include -#include "graph.h" -#include "../place_recognition_types.h" -#include -#include - -namespace ctx { - - /* - * type for numerical computations - */ - typedef double num_t; - - /* - * mac address - */ - class Mac { - - public: - const static size_t MAC_SIZE = 6; // number of bytes for mac address. - unsigned char c[MAC_SIZE]; - - Mac() {}; - Mac(const std::string &str); - Mac(const char *str); - operator std::string() const; - - }; /* class Mac */ - - std::istream &operator>>(std::istream &input, ctx::Mac &mac); - std::ostream &operator<<(std::ostream &output, const ctx::Mac &mac); - bool operator==(const ctx::Mac &m1, const ctx::Mac &m2); - bool operator!=(const ctx::Mac &m1, const ctx::Mac &m2); - bool operator<(const ctx::Mac &m1, const ctx::Mac &m2); - bool operator>(const ctx::Mac &m1, const ctx::Mac &m2); - -} /* namespace ctx */ - -namespace std { - - template <> struct hash { - size_t operator()(const ctx::Mac & m) const { - size_t h = 1; - for (size_t i = 0; i < ctx::Mac::MAC_SIZE; i++) { - h = h * 37 + m.c[i]; - } - return h; - } - }; - -} /* namespace std */ - -namespace ctx { - - typedef float share_t; - typedef int count_t; - - typedef std::unordered_map Macs2Counts; - typedef std::unordered_map Macs2Shares; - - typedef std::unordered_set MacSet; - - std::istream &operator>>(std::istream &input, ctx::MacSet &macSet); - std::ostream &operator<<(std::ostream &output, const ctx::MacSet &macSet); - ctx::MacSet macSetFromString(const std::string &str); - - std::shared_ptr macSetsUnion(const std::vector> &macSets); - - struct Interval { - time_t start; - time_t end; - - Interval(time_t start, time_t end); - }; - -} /* namespace ctx */ - -namespace std { - - template <> struct hash { - size_t operator()(const ctx::Interval & interval) const { - return interval.end * interval.start; - } - }; - -} /* namespace std */ - -namespace ctx { - - /* - * fully describes interval data after the interval is finished - */ - struct Frame { - Interval interval; - count_t numberOfTimestamps; - Macs2Counts macs2Counts; - - Frame(Interval interval_) : interval(interval_), numberOfTimestamps(0) {}; - }; - - /* - * mac address + its timestamp - */ - struct MacEvent { - time_t timestamp; - Mac mac; - - MacEvent(time_t timestamp_, Mac mac_) : timestamp(timestamp_), mac(mac_) {} - }; - - typedef std::map Categs; // scores of categories - - struct Location { - double latitude; - double longitude; - double accuracy; // [m] - - Location(double latitude_ = 0.0, double longitude_ = 0.0, double accuracy_ = -1.0) - : latitude(latitude_), longitude(longitude_), accuracy(accuracy_) {} - - }; /* struct Location */ - -#ifdef TIZEN_ENGINEER_MODE - enum LocationSource { - LOCATION_METHOD_REQUEST = 0, - LOCATION_METHOD_GET_LOCATION = 1, - LOCATION_METHOD_GET_LAST_LOCATION = 2 - }; -#endif /* TIZEN_ENGINEER_MODE */ - - /* - * location + timestamp + method - */ - struct LocationEvent { - Location coordinates; - time_t timestamp; - -#ifdef TIZEN_ENGINEER_MODE - LocationSource method; - - LocationEvent(double latitude_, double longitude_, double accuracy_, time_t timestamp_, LocationSource method_) : - coordinates(latitude_, longitude_, accuracy_), - timestamp(timestamp_), method(method_) {} -#else /* TIZEN_ENGINEER_MODE */ - LocationEvent(double latitude_, double longitude_, double accuracy_, time_t timestamp_) : - coordinates(latitude_, longitude_, accuracy_), - timestamp(timestamp_) {} -#endif /* TIZEN_ENGINEER_MODE */ - - void log(); - - }; /* struct LocationEvent */ - - struct Visit { - Interval interval; - std::shared_ptr macSet; - Categs categs; - bool locationValid; - Location location; // makes sense if locationValid == true; - - Visit(Interval interval_, std::shared_ptr macSet_ = std::make_shared(), Categs categs_ = Categs()) : - interval(interval_), - macSet(macSet_), - categs(categs_), - locationValid(false) {} - void setLocation(Location location); - void printShort2Stream(std::ostream &out) const; - - }; /* struct Visit */ - - bool operator==(const Visit &v1, const Visit &v2); - typedef std::vector Visits; - typedef std::vector MacEvents; // used to store current interval logs - - std::shared_ptr macSetFromMacs2Counts(const Macs2Counts &macs2Counts); - - typedef float confidence_t; - - class Place { - - public: - PlaceCategId categId; // category of a place (work/home/other) - confidence_t categConfidence; // confidence of the above category - between [0,1] - std::string name; // for now: "work"/"home"/"other" - bool locationValid; - Location location; // makes sense if locationValid == true; - std::string wifiAps; // WiFi APs MAC addresses separated by "," - time_t createDate; // The last update time of this place - - void print2Stream(std::ostream &out) const; - - }; /* class Place */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_USER_PLACES_TYPES_H_ */ diff --git a/src/place/recognition/user_places/visit_categer.cpp b/src/place/recognition/user_places/visit_categer.cpp deleted file mode 100644 index 1d4c0c6..0000000 --- a/src/place/recognition/user_places/visit_categer.cpp +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "visit_categer.h" -#include "mahal.h" -#include -#include "../place_recognition_types.h" -#include "prob_features_model.h" -#include - -// categorizer model parameters trained offline (implemented in python): -const std::map ctx::VisitCateger::__models({ -{ - PLACE_CATEG_ID_HOME, - ctx::MahalModel( - { - 0.588408417316, 0.475154840361, -0.564085141865, 0.077711893790, 0.782630398597, -0.650926403250, -0.101943950378 - }, - { - 0.797977863370, -0.133179879257, 0.242803062646, -0.059448581046, -0.117039646748, 0.097645535057, 0.014250290052, - -0.133179879257, 1.028900241400, -0.252245407243, 0.058455883835, -0.283950879851, 0.172204076583, 0.247906065767, - 0.242803062646, -0.252245407243, 1.832134785177, 0.327188225606, 0.874905851092, -0.371088938012, -1.289816938938, - -0.059448581046, 0.058455883835, 0.327188225606, 1.455090164348, 0.138363721074, 0.216985279422, -1.113021128017, - -0.117039646748, -0.283950879851, 0.874905851092, 0.138363721074, 1.379674755873, -0.977922749615, -0.738895486376, - 0.097645535057, 0.172204076583, -0.371088938012, 0.216985279422, -0.977922749615, 0.899928922718, -0.158101631251, - 0.014250290052, 0.247906065767, -1.289816938938, -1.113021128017, -0.738895486376, -0.158101631251, 2.644105309746 - }) -}, -{ - PLACE_CATEG_ID_WORK, - ctx::MahalModel( - { - -0.128092670982, -0.762177819157, 0.262924477521, -0.412038966097, -1.049141893517, 1.104760800499, -0.628939955525 - }, - { - 15.751249839350, 11.389025401325, -9.885346240379, -0.010809392387, -1.308837060762, 0.970778241189, 0.558946631235, - 11.389025401325, 12.830223040140, -8.517695939156, 0.293693134532, -0.845784968295, 1.418175236596, -2.246658259974, - -9.885346240379, -8.517695939156, 10.222750966685, 0.390448668966, 1.095218945062, -0.403733435617, -1.815103304859, - -0.010809392387, 0.293693134532, 0.390448668966, 2.256864603458, 0.632080300647, -0.019551779384, -1.751417951792, - -1.308837060762, -0.845784968295, 1.095218945062, 0.632080300647, 3.132753467561, -1.427748733399, -4.291958669471, - 0.970778241189, 1.418175236596, -0.403733435617, -0.019551779384, -1.427748733399, 1.183055586213, 0.200571452172, - 0.558946631235, -2.246658259974, -1.815103304859, -1.751417951792, -4.291958669471, 0.200571452172, 11.668888615934 - }) -}, -{ - PLACE_CATEG_ID_OTHER, - ctx::MahalModel( - { - -0.542340098504, 0.184789511765, 0.387451546413, 0.301902661472, 0.109392397093, -0.310468874039, 0.709513920221 - }, - { - 2.153884992301, -0.129488409324, 0.136236052776, -0.138043678532, -0.227492557156, 0.117810812390, 0.265072329266, - -0.129488409324, 3.165213522741, -1.751520714507, 0.467831090302, -0.483916138161, 0.376293684450, 0.149387541935, - 0.136236052776, -1.751520714507, 2.483475248800, 0.384085303028, 0.338642175318, -0.052000492068, -0.801404345627, - -0.138043678532, 0.467831090302, 0.384085303028, 1.972390458477, -0.025332052563, 0.393845805027, -1.225948397955, - -0.227492557156, -0.483916138161, 0.338642175318, -0.025332052563, 0.890301343360, -0.549163112351, -0.746838701215, - 0.117810812390, 0.376293684450, -0.052000492068, 0.393845805027, -0.549163112351, 0.474674836872, 0.012417969474, - 0.265072329266, 0.149387541935, -0.801404345627, -1.225948397955, -0.746838701215, 0.012417969474, 2.104629121515 - }) -}}); - -ctx::PiecewiseLin ctx::VisitCateger::__chiApprox( -{ - 0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, - 0.09, 0.1 , 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, - 0.18, 0.19, 0.2 , 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, - 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32, 0.33, 0.34, 0.35, - 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43, 0.44, - 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, - 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, - 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, - 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8 , - 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, - 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, - 0.99, 1. , 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, - 1.08, 1.09, 1.1 , 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, - 1.17, 1.18, 1.19, 1.2 , 1.21, 1.22, 1.23, 1.24, 1.25, - 1.26, 1.27, 1.28, 1.29, 1.3 , 1.31, 1.32, 1.33, 1.34, - 1.35, 1.36, 1.37, 1.38, 1.39, 1.4 , 1.41, 1.42, 1.43, - 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5 , 1.51, 1.52, - 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.6 , 1.61, - 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.7 , - 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79, - 1.8 , 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, - 1.89, 1.9 , 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, - 1.98, 1.99, 2. , 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, - 2.07, 2.08, 2.09, 2.1 , 2.11, 2.12, 2.13, 2.14, 2.15, - 2.16, 2.17, 2.18, 2.19, 2.2 , 2.21, 2.22, 2.23, 2.24, - 2.25, 2.26, 2.27, 2.28, 2.29, 2.3 , 2.31, 2.32, 2.33, - 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4 , 2.41, 2.42, - 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5 , 2.51, - 2.52, 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59, 2.6 , - 2.61, 2.62, 2.63, 2.64, 2.65, 2.66, 2.67, 2.68, 2.69, - 2.7 , 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 2.77, 2.78, - 2.79, 2.8 , 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, - 2.88, 2.89, 2.9 , 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, - 2.97, 2.98, 2.99, 3. , 3.01, 3.02, 3.03, 3.04, 3.05, - 3.06, 3.07, 3.08, 3.09, 3.1 , 3.11, 3.12, 3.13, 3.14, - 3.15, 3.16, 3.17, 3.18, 3.19, 3.2 , 3.21, 3.22, 3.23, - 3.24, 3.25, 3.26, 3.27, 3.28, 3.29, 3.3 , 3.31, 3.32, - 3.33, 3.34, 3.35, 3.36, 3.37, 3.38, 3.39, 3.4 , 3.41, - 3.42, 3.43, 3.44, 3.45, 3.46, 3.47, 3.48, 3.49, 3.5 , - 3.51, 3.52, 3.53, 3.54, 3.55, 3.56, 3.57, 3.58, 3.59, - 3.6 , 3.61, 3.62, 3.63, 3.64, 3.65, 3.66, 3.67, 3.68, - 3.69, 3.7 , 3.71, 3.72, 3.73, 3.74, 3.75, 3.76, 3.77, - 3.78, 3.79, 3.8 , 3.81, 3.82, 3.83, 3.84, 3.85, 3.86, - 3.87, 3.88, 3.89, 3.9 , 3.91, 3.92, 3.93, 3.94, 3.95, - 3.96, 3.97, 3.98, 3.99, 4. , 4.01, 4.02, 4.03, 4.04, - 4.05, 4.06, 4.07, 4.08, 4.09, 4.1 , 4.11, 4.12, 4.13, - 4.14, 4.15, 4.16, 4.17, 4.18, 4.19, 4.2 , 4.21, 4.22, - 4.23, 4.24, 4.25, 4.26, 4.27, 4.28, 4.29, 4.3 , 4.31, - 4.32, 4.33, 4.34, 4.35, 4.36, 4.37, 4.38, 4.39, 4.4 , - 4.41, 4.42, 4.43, 4.44, 4.45, 4.46, 4.47, 4.48, 4.49, - 4.5 , 4.51, 4.52, 4.53, 4.54, 4.55, 4.56, 4.57, 4.58, - 4.59, 4.6 , 4.61, 4.62, 4.63, 4.64, 4.65, 4.66, 4.67, - 4.68, 4.69, 4.7 , 4.71, 4.72, 4.73, 4.74, 4.75, 4.76, - 4.77, 4.78, 4.79, 4.8 , 4.81, 4.82, 4.83, 4.84, 4.85, - 4.86, 4.87, 4.88, 4.89, 4.9 , 4.91, 4.92, 4.93, 4.94, - 4.95, 4.96, 4.97, 4.98, 4.99, 5. , 5.01, 5.02, 5.03, - 5.04, 5.05, 5.06, 5.07, 5.08, 5.09, 5.1 , 5.11, 5.12, - 5.13, 5.14, 5.15, 5.16, 5.17, 5.18, 5.19, 5.2 , 5.21, - 5.22, 5.23, 5.24, 5.25, 5.26, 5.27, 5.28, 5.29, 5.3 , - 5.31, 5.32, 5.33, 5.34, 5.35, 5.36, 5.37, 5.38, 5.39, - 5.4 , 5.41, 5.42, 5.43, 5.44, 5.45, 5.46, 5.47, 5.48, - 5.49, 5.5 , 5.51, 5.52, 5.53, 5.54, 5.55, 5.56, 5.57, - 5.58, 5.59, 5.6 , 5.61, 5.62, 5.63, 5.64, 5.65, 5.66, - 5.67, 5.68, 5.69, 5.7 , 5.71, 5.72, 5.73, 5.74, 5.75, - 5.76, 5.77, 5.78, 5.79, 5.8 , 5.81, 5.82, 5.83, 5.84, - 5.85, 5.86, 5.87, 5.88, 5.89, 5.9 , 5.91, 5.92, 5.93, - 5.94, 5.95, 5.96, 5.97, 5.98, 5.99, 6. , 6.01, 6.02, - 6.03, 6.04, 6.05, 6.06, 6.07, 6.08, 6.09, 6.1 , 6.11, - 6.12, 6.13, 6.14, 6.15, 6.16, 6.17, 6.18, 6.19, 6.2 , - 6.21, 6.22, 6.23, 6.24, 6.25, 6.26, 6.27, 6.28, 6.29, - 6.3 , 6.31, 6.32, 6.33, 6.34, 6.35, 6.36, 6.37, 6.38, - 6.39, 6.4 , 6.41, 6.42, 6.43, 6.44, 6.45, 6.46, 6.47, - 6.48, 6.49, 6.5 , 6.51, 6.52, 6.53, 6.54, 6.55, 6.56, - 6.57, 6.58, 6.59, 6.6 , 6.61, 6.62, 6.63, 6.64, 6.65, - 6.66, 6.67, 6.68, 6.69, 6.7 , 6.71, 6.72, 6.73, 6.74, - 6.75, 6.76, 6.77, 6.78, 6.79, 6.8 , 6.81, 6.82, 6.83, - 6.84, 6.85, 6.86, 6.87, 6.88, 6.89, 6.9 , 6.91, 6.92, - 6.93, 6.94, 6.95, 6.96, 6.97, 6.98, 6.99, 7. -}, -{ - 0. , 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0.000001, 0.000001, 0.000001, 0.000001, - 0.000002, 0.000002, 0.000003, 0.000003, 0.000004, 0.000005, - 0.000006, 0.000007, 0.000008, 0.00001 , 0.000012, 0.000014, - 0.000016, 0.000019, 0.000023, 0.000026, 0.000031, 0.000035, - 0.000041, 0.000047, 0.000054, 0.000062, 0.00007 , 0.00008 , - 0.000091, 0.000103, 0.000116, 0.000131, 0.000147, 0.000165, - 0.000185, 0.000207, 0.000231, 0.000257, 0.000285, 0.000316, - 0.00035 , 0.000387, 0.000427, 0.000471, 0.000518, 0.000569, - 0.000624, 0.000683, 0.000747, 0.000816, 0.00089 , 0.00097 , - 0.001055, 0.001147, 0.001245, 0.001349, 0.001461, 0.00158 , - 0.001708, 0.001843, 0.001987, 0.002141, 0.002303, 0.002476, - 0.002659, 0.002854, 0.003059, 0.003276, 0.003506, 0.003748, - 0.004004, 0.004274, 0.004558, 0.004857, 0.005171, 0.005502, - 0.00585 , 0.006215, 0.006597, 0.006999, 0.007419, 0.007859, - 0.00832 , 0.008802, 0.009305, 0.009831, 0.01038 , 0.010953, - 0.01155 , 0.012172, 0.01282 , 0.013495, 0.014197, 0.014927, - 0.015686, 0.016473, 0.017291, 0.01814 , 0.019021, 0.019933, - 0.020879, 0.021858, 0.022872, 0.023921, 0.025006, 0.026127, - 0.027285, 0.028482, 0.029717, 0.030992, 0.032306, 0.033662, - 0.035059, 0.036497, 0.037979, 0.039504, 0.041073, 0.042687, - 0.044345, 0.04605 , 0.047801, 0.049599, 0.051445, 0.053339, - 0.055282, 0.057273, 0.059315, 0.061406, 0.063548, 0.065742, - 0.067986, 0.070283, 0.072632, 0.075034, 0.077488, 0.079996, - 0.082558, 0.085174, 0.087843, 0.090568, 0.093346, 0.09618 , - 0.099069, 0.102013, 0.105012, 0.108066, 0.111176, 0.114342, - 0.117563, 0.120839, 0.124171, 0.127558, 0.131001, 0.134499, - 0.138052, 0.141659, 0.145322, 0.149039, 0.15281 , 0.156635, - 0.160514, 0.164446, 0.168431, 0.172469, 0.176559, 0.180701, - 0.184894, 0.189138, 0.193432, 0.197776, 0.202169, 0.206611, - 0.211101, 0.215639, 0.220223, 0.224853, 0.229528, 0.234248, - 0.239012, 0.24382 , 0.248669, 0.25356 , 0.258492, 0.263464, - 0.268474, 0.273523, 0.278608, 0.283731, 0.288888, 0.29408 , - 0.299305, 0.304562, 0.309851, 0.31517 , 0.320519, 0.325895, - 0.331299, 0.336729, 0.342185, 0.347664, 0.353166, 0.35869 , - 0.364234, 0.369798, 0.375381, 0.38098 , 0.386596, 0.392227, - 0.397871, 0.403529, 0.409197, 0.414876, 0.420565, 0.426261, - 0.431964, 0.437673, 0.443387, 0.449103, 0.454822, 0.460543, - 0.466263, 0.471981, 0.477698, 0.483411, 0.48912 , 0.494822, - 0.500518, 0.506206, 0.511886, 0.517554, 0.523212, 0.528858, - 0.53449 , 0.540108, 0.545711, 0.551297, 0.556866, 0.562417, - 0.567948, 0.573459, 0.578949, 0.584417, 0.589861, 0.595282, - 0.600677, 0.606048, 0.611391, 0.616707, 0.621995, 0.627254, - 0.632483, 0.637681, 0.642848, 0.647984, 0.653086, 0.658155, - 0.66319 , 0.66819 , 0.673155, 0.678084, 0.682976, 0.687831, - 0.692649, 0.697428, 0.702168, 0.70687 , 0.711531, 0.716153, - 0.720733, 0.725273, 0.729772, 0.734228, 0.738643, 0.743015, - 0.747344, 0.75163 , 0.755873, 0.760072, 0.764227, 0.768339, - 0.772406, 0.776428, 0.780406, 0.784339, 0.788228, 0.792071, - 0.795869, 0.799622, 0.80333 , 0.806992, 0.810609, 0.814181, - 0.817707, 0.821188, 0.824624, 0.828015, 0.83136 , 0.83466 , - 0.837916, 0.841126, 0.844292, 0.847413, 0.85049 , 0.853522, - 0.85651 , 0.859455, 0.862355, 0.865212, 0.868026, 0.870796, - 0.873524, 0.876209, 0.878852, 0.881452, 0.884011, 0.886528, - 0.889005, 0.89144 , 0.893834, 0.896189, 0.898503, 0.900778, - 0.903014, 0.90521 , 0.907369, 0.909488, 0.911571, 0.913615, - 0.915623, 0.917594, 0.919528, 0.921427, 0.92329 , 0.925118, - 0.926911, 0.92867 , 0.930395, 0.932086, 0.933745, 0.93537 , - 0.936963, 0.938525, 0.940055, 0.941554, 0.943022, 0.94446 , - 0.945869, 0.947248, 0.948598, 0.949919, 0.951213, 0.952478, - 0.953717, 0.954928, 0.956113, 0.957273, 0.958406, 0.959514, - 0.960598, 0.961657, 0.962692, 0.963703, 0.964692, 0.965657, - 0.9666 , 0.967521, 0.968421, 0.969299, 0.970156, 0.970993, - 0.97181 , 0.972607, 0.973385, 0.974144, 0.974884, 0.975605, - 0.976309, 0.976996, 0.977665, 0.978317, 0.978953, 0.979572, - 0.980176, 0.980764, 0.981337, 0.981895, 0.982438, 0.982967, - 0.983482, 0.983984, 0.984472, 0.984947, 0.985409, 0.985858, - 0.986296, 0.986721, 0.987135, 0.987537, 0.987929, 0.988309, - 0.988678, 0.989038, 0.989387, 0.989726, 0.990056, 0.990376, - 0.990687, 0.990989, 0.991282, 0.991566, 0.991843, 0.992111, - 0.992371, 0.992624, 0.992869, 0.993106, 0.993337, 0.99356 , - 0.993777, 0.993988, 0.994191, 0.994389, 0.99458 , 0.994766, - 0.994946, 0.99512 , 0.995289, 0.995452, 0.99561 , 0.995764, - 0.995912, 0.996056, 0.996195, 0.996329, 0.99646 , 0.996586, - 0.996708, 0.996825, 0.996939, 0.99705 , 0.997156, 0.99726 , - 0.997359, 0.997456, 0.997549, 0.997639, 0.997726, 0.99781 , - 0.997891, 0.997969, 0.998045, 0.998118, 0.998189, 0.998257, - 0.998323, 0.998386, 0.998447, 0.998506, 0.998563, 0.998618, - 0.998671, 0.998723, 0.998772, 0.998819, 0.998865, 0.998909, - 0.998952, 0.998993, 0.999033, 0.999071, 0.999107, 0.999143, - 0.999177, 0.99921 , 0.999241, 0.999272, 0.999301, 0.999329, - 0.999356, 0.999382, 0.999407, 0.999431, 0.999455, 0.999477, - 0.999498, 0.999519, 0.999539, 0.999558, 0.999576, 0.999594, - 0.999611, 0.999627, 0.999643, 0.999658, 0.999672, 0.999686, - 0.999699, 0.999712, 0.999724, 0.999736, 0.999747, 0.999758, - 0.999769, 0.999779, 0.999788, 0.999797, 0.999806, 0.999815, - 0.999823, 0.99983 , 0.999838, 0.999845, 0.999852, 0.999858, - 0.999865, 0.999871, 0.999876, 0.999882, 0.999887, 0.999892, - 0.999897, 0.999902, 0.999906, 0.99991 , 0.999915, 0.999918, - 0.999922, 0.999926, 0.999929, 0.999932, 0.999936, 0.999938, - 0.999941, 0.999944, 0.999947, 0.999949, 0.999952, 0.999954, - 0.999956, 0.999958, 0.99996 , 0.999962, 0.999964, 0.999965, - 0.999967, 0.999969, 0.99997 , 0.999972, 0.999973, 0.999974, - 0.999975, 0.999977, 0.999978, 0.999979, 0.99998 , 0.999981, - 0.999982, 0.999983, 0.999984, 0.999984, 0.999985, 0.999986, - 0.999987, 0.999987, 0.999988, 0.999988, 0.999989, 0.99999 , - 0.99999 , 0.999991, 0.999991, 0.999992, 0.999992, 0.999992, - 0.999993, 0.999993, 0.999993, 0.999994, 0.999994, 0.999994, - 0.999995, 0.999995, 0.999995, 0.999995, 0.999996, 0.999996, - 0.999996, 0.999996, 0.999997, 0.999997, 0.999997, 0.999997, - 0.999997, 0.999997, 0.999998, 0.999998, 0.999998, 0.999998, - 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, - 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, - 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, - 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, - 0.999999, 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. , 1. , - 1. , 1. , 1. , 1. , 1. -} // this is chi cdf for 7 degrees of freedom (because we have 7 features) -); - -const std::vector ctx::VisitCateger::__featuresMean( -{ - 344.542975696503, - 894.178423236515, - 868.300533491405, - 2.820391227030, - 0.511747454052, - 0.348669092762, - 0.139583453187 -}); - -const std::vector ctx::VisitCateger::__featuresStd( -{ - 416.061437196941, - 301.401812101781, - 300.774466281622, - 1.916233112930, - 0.314254748759, - 0.360707461975, - 0.109386661911 -}); - -ctx::TimeFeatures ctx::VisitCateger::timeFeatures(const time_t &time) -{ - struct tm *timeinfo = localtime(&time); - if (timeinfo == NULL) { - return {0, 0, 0, false}; - } - int minutesSinceMidnight = 60 * timeinfo->tm_hour + timeinfo->tm_min; - int weekday = (timeinfo->tm_wday + 6) % 7; // Monday is 0, Sunday is 6 - bool weekend = weekday > 4; - int minutesSinceBeginingOfTheWeek = 24 * 60 * weekday + minutesSinceMidnight; - return { - minutesSinceMidnight, - minutesSinceBeginingOfTheWeek, - weekday, - weekend - }; -} - -int ctx::VisitCateger::weeksScope(const TimeFeatures &startF, const Interval &interval) -{ - int durationMinutes = (interval.end - interval.start) / 60; - int scopeMinutes = startF.minutesSinceBeginingOfTheWeek + durationMinutes; - int weeksScope = scopeMinutes / __MINUTES_IN_WEEK; - if (scopeMinutes % __MINUTES_IN_WEEK > 0) { - weeksScope++; - } - return weeksScope; -} - -ctx::num_t ctx::VisitCateger::__sum(const std::vector model, const size_t &from, const size_t &to) -{ - size_t toSecure = to; - if (to >= model.size()) { - _E("'to' exceeds model size"); - toSecure = model.size() - 1; - } - - if (from > to) { - _E("'from' greater than 'to'"); - } - - num_t result = 0.0; - for (size_t i = from; i <= toSecure; i++) { - result += model[i]; - } - - return result; -} - -ctx::num_t ctx::VisitCateger::__weekModelMeanValue(PlaceCategId categ, const Interval &interval, - const TimeFeatures &startF, const TimeFeatures &endF) -{ - num_t ret = 0.0; - int minutes = 0; - int ws = weeksScope(startF, interval); - for (int week = 1; week <= ws; week++) { - size_t startIndex = (week == 1) - ? startF.minutesSinceBeginingOfTheWeek - : 0; - size_t endIndex = (week == ws) - ? endF.minutesSinceBeginingOfTheWeek - : __MINUTES_IN_WEEK - 1; - ret += __sum(prob_features::weekModel[categ], startIndex, endIndex); - minutes += endIndex - startIndex + 1; - } - if (minutes > 0) { - return ret / minutes; - } - return ret; -} - -ctx::Categs ctx::VisitCateger::weekModelFeatures(const Interval &interval, const TimeFeatures &startF, const TimeFeatures &endF) -{ - ctx::Categs categs; - for (const auto &item : prob_features::weekModel) { - categs[item.first] = __weekModelMeanValue(item.first, interval, startF, endF); - } - _D("categs: H=%.12f, W=%.12f, O=%.12f", - categs[PLACE_CATEG_ID_HOME], - categs[PLACE_CATEG_ID_WORK], - categs[PLACE_CATEG_ID_OTHER]); - return categs; -} - -ctx::IntervalFeatures ctx::VisitCateger::intervalFeatures(const Interval &interval) -{ - num_t durationMinutes = 1.0 * (interval.end - interval.start) / 60; - TimeFeatures startFeatures = timeFeatures(interval.start); - TimeFeatures endFeatures = timeFeatures(interval.end); - Categs weekFeatures = weekModelFeatures(interval, startFeatures, endFeatures); - return { - durationMinutes, - (num_t) startFeatures.minutesSinceMidnight, - (num_t) endFeatures.minutesSinceMidnight, - (num_t) startFeatures.weekday, - weekFeatures[PLACE_CATEG_ID_HOME], - weekFeatures[PLACE_CATEG_ID_WORK], - weekFeatures[PLACE_CATEG_ID_OTHER] - }; -} - -void ctx::VisitCateger::__normalize(std::vector &features) -{ - size_t n = features.size(); - for (size_t i = 0; i < n; i++) { - features[i] -= __featuresMean[i]; - features[i] /= __featuresStd[i]; - } -} - -void ctx::VisitCateger::categorize(ctx::Visit &visit) -{ - IntervalFeatures features = intervalFeatures(visit.interval); - __normalize(features); - - for (auto &modelPair : __models) { - int categId = modelPair.first; - MahalModel model = modelPair.second; - - num_t distance = model.distance(features); - num_t probability = 1 - __chiApprox.value(distance); // sth like probability but not exactly - visit.categs[categId] = probability; - } -} diff --git a/src/place/recognition/user_places/visit_categer.h b/src/place/recognition/user_places/visit_categer.h deleted file mode 100644 index b9d4940..0000000 --- a/src/place/recognition/user_places/visit_categer.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_VISIT_CATEGER_H_ -#define _CONTEXT_PLACE_RECOGNITION_VISIT_CATEGER_H_ - -#include "user_places_types.h" -#include "mahal.h" -#include "piecewise_lin.h" -#include - -namespace ctx { - - struct TimeFeatures { - int minutesSinceMidnight; - int minutesSinceBeginingOfTheWeek; - int weekday; - bool weekend; - }; - - typedef std::vector IntervalFeatures; - - /* - * visit categorizer class - */ - class VisitCateger { - - private: - static const int __MINUTES_IN_WEEK = 60 * 24 * 7; - static const std::map __models; - static const std::vector __featuresMean; - static const std::vector __featuresStd; - static num_t __sum(const std::vector model, const size_t &from, const size_t &to); - static num_t __weekModelMeanValue(PlaceCategId categ, const Interval &interval, - const TimeFeatures &startF, const TimeFeatures &endF); - static void __normalize(std::vector &features); - static PiecewiseLin __chiApprox; // tabled chi function approximator - - public: - /** - * Function interpret time in timestamp input argument, - * - * @param time timestamp - * @return TimeFeatures structure with interpretations of timestamp - */ - static TimeFeatures timeFeatures(const time_t &time); - - static int weeksScope(const TimeFeatures &startF, const Interval &interval); - - /** - * Function interpret time interval input argument and calculates scores - * that argument interval is home, work or other based on whole week model. - * - * @param interval time interval - * @param startF start time features - * @param endF end time features - * @return Categs score that argument interval is home, work or other - */ - static Categs weekModelFeatures(const Interval &interval, const TimeFeatures &startF, - const TimeFeatures &endF); - - /** - * Function interpret time interval input argument, - * - * @param interval time interval - * @return IntervalFeatures vector with interpretations of input time interval - */ - static IntervalFeatures intervalFeatures(const Interval &interval); - - /** - * Function categorize visit based on visits time interval and fill its categories values. - */ - static void categorize(ctx::Visit &visit); - - }; /* class VisitCateger */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_VISIT_CATEGER_H_ */ diff --git a/src/place/recognition/user_places/visit_detector.cpp b/src/place/recognition/user_places/visit_detector.cpp deleted file mode 100644 index e0ba642..0000000 --- a/src/place/recognition/user_places/visit_detector.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include -#include -#include -#include "../place_recognition_types.h" -#include "visit_detector.h" -#include "user_places_params.h" -#include "visit_categer.h" -#include "similarity.h" -#include "median.h" -#include "debug_utils.h" - -#ifdef TIZEN_ENGINEER_MODE -#define __VISIT_TABLE_COLUMNS \ - VISIT_COLUMN_WIFI_APS " TEXT, "\ - VISIT_COLUMN_START_TIME " timestamp, "\ - VISIT_COLUMN_END_TIME " timestamp, "\ - VISIT_COLUMN_START_TIME_HUMAN " TEXT, "\ - VISIT_COLUMN_END_TIME_HUMAN " TEXT, "\ - VISIT_COLUMN_LOCATION_VALID " INTEGER, "\ - VISIT_COLUMN_LOCATION_LATITUDE " REAL, "\ - VISIT_COLUMN_LOCATION_LONGITUDE " REAL, "\ - VISIT_COLUMN_CATEG_HOME " REAL, "\ - VISIT_COLUMN_CATEG_WORK " REAL, "\ - VISIT_COLUMN_CATEG_OTHER " REAL" -#else /* TIZEN_ENGINEER_MODE */ -#define __VISIT_TABLE_COLUMNS \ - VISIT_COLUMN_WIFI_APS " TEXT, "\ - VISIT_COLUMN_START_TIME " timestamp, "\ - VISIT_COLUMN_END_TIME " timestamp, "\ - VISIT_COLUMN_LOCATION_VALID " INTEGER, "\ - VISIT_COLUMN_LOCATION_LATITUDE " REAL, "\ - VISIT_COLUMN_LOCATION_LONGITUDE " REAL, "\ - VISIT_COLUMN_CATEG_HOME " REAL, "\ - VISIT_COLUMN_CATEG_WORK " REAL, "\ - VISIT_COLUMN_CATEG_OTHER " REAL" -#endif /* TIZEN_ENGINEER_MODE */ - -ctx::VisitDetector::VisitDetector(time_t startScan, PlaceRecogMode energyMode, bool testMode) : - __testMode(testMode), - __locationLogger(this, testMode), - __wifiLogger(this, energyMode, testMode), - __currentInterval(startScan, startScan + VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY), - __stableCounter(0), - __tolerance(VISIT_DETECTOR_TOLERANCE_DEPTH), - __entranceToPlace(false), - __periodSeconds(VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY), - __entranceTime(0), - __departureTime(0) -{ - __setPeriod(energyMode); - __currentInterval = Interval(startScan, startScan + __periodSeconds); - __currentMacEvents = std::make_shared(); - __stayMacs = std::make_shared(); - - if (__testMode) { - __detectedVisits = std::make_shared(); - return; - } - - __listeners.push_back(&__locationLogger); - __listeners.push_back(&__wifiLogger); - __dbCreateTable(); - __wifiLogger.startLogging(); -} - -ctx::VisitDetector::~VisitDetector() -{ -} - -bool ctx::VisitDetector::__isValid(const ctx::Mac &mac) -{ - return mac != "00:00:00:00:00:00"; -} - -void ctx::VisitDetector::onWifiScan(ctx::MacEvent e) -{ - _D("timestamp=%d, curent_interval.end=%d, mac=%s", e.timestamp, __currentInterval.end, std::string(e.mac).c_str()); - if (__isValid(e.mac)) { - while (e.timestamp > __currentInterval.end) { - __processCurrentLogger(); - __shiftCurrentInterval(); - } - __currentMacEvents->push_back(e); - } -} - -void ctx::VisitDetector::__processCurrentLogger() -{ - _D(""); - std::shared_ptr frame = __makeFrame(__currentMacEvents, __currentInterval); - __detectEntranceOrDeparture(frame); - __currentMacEvents->clear(); -} - -std::shared_ptr ctx::VisitDetector::__makeFrame(std::shared_ptr logger, ctx::Interval interval) -{ - std::set timestamps; - std::shared_ptr frame = std::make_shared(interval); - for (auto log : *logger) { - timestamps.insert(log.timestamp); - if (frame->macs2Counts.find(log.mac) == frame->macs2Counts.end()) { - frame->macs2Counts[log.mac] = 1; - } else { - frame->macs2Counts[log.mac] += 1; - } - } - frame->numberOfTimestamps = timestamps.size(); - return frame; -} - -void ctx::VisitDetector::__shiftCurrentInterval() -{ - __currentInterval.end += __periodSeconds; - __currentInterval.start += __periodSeconds; -} - -void ctx::VisitDetector::__detectEntranceOrDeparture(std::shared_ptr frame) -{ - __entranceToPlace ? __detectDeparture(frame) : __detectEntrance(frame); -} - -bool ctx::VisitDetector::__isDisjoint(const ctx::Macs2Counts &macs2Counts, const ctx::MacSet &macSet) -{ - for (auto &mac : macSet) { - if (macs2Counts.find(mac) != macs2Counts.end()) { - return false; - } - } - return true; -} - -bool ctx::VisitDetector::__protrudesFrom(const ctx::Macs2Counts &macs2Counts, const ctx::MacSet &macSet) -{ - for (auto &macCount : macs2Counts) { - if (macSet.find(macCount.first) == macSet.end()) { - return true; - } - } - return false; -} - -void ctx::VisitDetector::__detectDeparture(std::shared_ptr frame) -{ - if (__tolerance == VISIT_DETECTOR_TOLERANCE_DEPTH) { - __departureTime = frame->interval.start; - __bufferedFrames.clear(); - } else { // __tolerance < VISIT_DETECTOR_TOLERANCE_DEPTH - __bufferedFrames.push_back(frame); - } - if (__isDisjoint(frame->macs2Counts, *__representativesMacs)) { - if (frame->macs2Counts.empty() || __protrudesFrom(frame->macs2Counts, *__stayMacs)) { - __tolerance--; - } else { // no new macs - __bufferedFrames.clear(); - } - if (__tolerance == 0) { // departure detected - __visitEndDetected(); - __processBuffer(frame); - } - } else if (__tolerance < VISIT_DETECTOR_TOLERANCE_DEPTH) { - __tolerance++; - } -} - -void ctx::VisitDetector::__visitStartDetected() -{ - __entranceToPlace = true; - - __locationEvents.clear(); - if (!__testMode) { - for (IVisitListener* listener : __listeners) { - listener->onVisitStart(); - } - } - __representativesMacs = __selectRepresentatives(__historyFrames); - __entranceTime = __historyFrames[0]->interval.start; - _I("Entrance detected, timestamp: %d", __entranceTime); - __resetHistory(); -} - -void ctx::VisitDetector::__visitEndDetected() -{ - if (!__testMode) { - for (IVisitListener* listener : __listeners) { - listener->onVisitEnd(); - } - } - _I("Departure detected, timestamp: %d", __departureTime); - - Interval interval(__entranceTime, __departureTime); - Visit visit(interval, __representativesMacs); - VisitCateger::categorize(visit); - - __putLocationToVisit(visit); - - if (__testMode) { - __detectedVisits->push_back(visit); - } else { - __dbInsertVisit(visit); - } - - // cleaning - __entranceToPlace = false; - __representativesMacs.reset(); - __tolerance = VISIT_DETECTOR_TOLERANCE_DEPTH; -} - -void ctx::VisitDetector::__putLocationToVisit(ctx::Visit &visit) -{ - // TODO: remove small accuracy locations from vectors? - std::vector latitudes; - std::vector longitudes; - visit.locationValid = false; - for (LocationEvent location : __locationEvents) { - if (location.timestamp >= __entranceTime && location.timestamp <= __departureTime) { - latitudes.push_back(location.coordinates.latitude); - longitudes.push_back(location.coordinates.longitude); - visit.locationValid = true; - } - } - if (visit.locationValid) { - visit.location.latitude = median(latitudes); - visit.location.longitude = median(longitudes); - _D("visit location set: lat=%.8f, lon=%.8f", visit.location.latitude, visit.location.longitude); - } else { - _D("visit location not set"); - } -} - -void ctx::VisitDetector::__processBuffer(std::shared_ptr frame) -{ - if (__bufferedFrames.empty()) { - __historyFrames.push_back(frame); - } else { - __historyFrames.push_back(__bufferedFrames[0]); - for (size_t i = 1; i < __bufferedFrames.size(); i++) { - __detectEntrance(__bufferedFrames[i]); - if (__entranceToPlace) { - break; - } - } - } -} - -void ctx::VisitDetector::__detectEntrance(std::shared_ptr currentFrame) -{ - if (currentFrame->macs2Counts.empty() || __historyFrames.empty()) { - __resetHistory(currentFrame); - return; - } - - if (__stableCounter == 0) { - std::shared_ptr oldestHistoryFrame = __historyFrames[0]; - __stayMacs = macSetFromMacs2Counts(oldestHistoryFrame->macs2Counts); - } - - std::shared_ptr currentBeacons = macSetFromMacs2Counts(currentFrame->macs2Counts); - - if (similarity::overlapBiggerOverSmaller(*currentBeacons, *__stayMacs) > VISIT_DETECTOR_OVERLAP) { - __stableCounter++; - __historyFrames.push_back(currentFrame); - - if (__stableCounter == VISIT_DETECTOR_STABLE_DEPTH) { // entrance detected - __visitStartDetected(); - } - } else { - __resetHistory(currentFrame); - } - return; -} - -void ctx::VisitDetector::__resetHistory() -{ - __stableCounter = 0; - __historyFrames.clear(); -} - -void ctx::VisitDetector::__resetHistory(std::shared_ptr frame) -{ - __resetHistory(); - __historyFrames.push_back(frame); -} - -std::shared_ptr ctx::VisitDetector::__selectRepresentatives(const std::vector> &frames) -{ - Macs2Counts reprs2Counts; - count_t allCount = 0; - - for (auto frame : frames) { - allCount += frame->numberOfTimestamps; - for (auto &c : frame->macs2Counts) { - reprs2Counts[c.first] += c.second; - } - } - - std::shared_ptr reprs2Shares = __macSharesFromCounts(reprs2Counts, allCount); - - share_t maxShare = __calcMaxShare(*reprs2Shares); - share_t threshold = maxShare < VISIT_DETECTOR_REP_THRESHOLD ? maxShare : VISIT_DETECTOR_REP_THRESHOLD; - - std::shared_ptr reprsMacSet = __macSetOfGreaterOrEqualShare(*reprs2Shares, threshold); - - return reprsMacSet; -} - -ctx::share_t ctx::VisitDetector::__calcMaxShare(const ctx::Macs2Shares &macs2Shares) -{ - ctx::share_t maxShare = 0.0; - for (auto &macShare : macs2Shares) { - if (macShare.second > maxShare) { - maxShare = macShare.second; - } - } - return maxShare; -} - -std::shared_ptr ctx::VisitDetector::__macSetOfGreaterOrEqualShare(const ctx::Macs2Shares &macs2Shares, ctx::share_t threshold) -{ - std::shared_ptr macSet = std::make_shared(); - for (auto &macShare : macs2Shares) { - if (macShare.second >= threshold) { - macSet->insert(macShare.first); - } - } - return macSet; -} - -std::shared_ptr ctx::VisitDetector::__macSharesFromCounts(ctx::Macs2Counts const &macs2Counts, ctx::count_t denominator) -{ - std::shared_ptr macs2Shares(std::make_shared()); - for (auto macCount : macs2Counts) { - (*macs2Shares)[macCount.first] = (share_t) macCount.second / denominator; - } - return macs2Shares; -} - -std::shared_ptr ctx::VisitDetector::getVisits() -{ - return __detectedVisits; -} - -void ctx::VisitDetector::__dbCreateTable() -{ - bool ret = __dbManager.createTable(0, VISIT_TABLE, __VISIT_TABLE_COLUMNS); - _D("db: visit Table Creation Result: %s", ret ? "SUCCESS" : "FAIL"); -} - -void ctx::VisitDetector::__putVisitCategToJson(const char* key, const Categs &categs, int categType, Json &data) -{ - auto categ = categs.find(categType); - if (categ == categs.end()) { - _E("json_put_visit no type %d in categs", categType); - } else { - data.set(NULL, key, categ->second); - } -} - -void ctx::VisitDetector::__putVisitCategsToJson(const Categs &categs, Json &data) -{ - __putVisitCategToJson(VISIT_COLUMN_CATEG_HOME, categs, PLACE_CATEG_ID_HOME, data); - __putVisitCategToJson(VISIT_COLUMN_CATEG_WORK, categs, PLACE_CATEG_ID_WORK, data); - __putVisitCategToJson(VISIT_COLUMN_CATEG_OTHER, categs, PLACE_CATEG_ID_OTHER, data); -} - -int ctx::VisitDetector::__dbInsertVisit(Visit visit) -{ - std::stringstream ss; - ss << *visit.macSet; - - Json data; - data.set(NULL, VISIT_COLUMN_WIFI_APS, ss.str().c_str()); - - data.set(NULL, VISIT_COLUMN_LOCATION_VALID, visit.locationValid); - data.set(NULL, VISIT_COLUMN_LOCATION_LATITUDE, visit.location.latitude); - data.set(NULL, VISIT_COLUMN_LOCATION_LONGITUDE, visit.location.longitude); - - data.set(NULL, VISIT_COLUMN_START_TIME, static_cast(visit.interval.start)); - data.set(NULL, VISIT_COLUMN_END_TIME, static_cast(visit.interval.end)); - -#ifdef TIZEN_ENGINEER_MODE - std::string startTimeHuman = DebugUtils::humanReadableDateTime(visit.interval.start, "%F %T", 80); - std::string endTimeHuman = DebugUtils::humanReadableDateTime(visit.interval.end, "%F %T", 80); - data.set(NULL, VISIT_COLUMN_START_TIME_HUMAN, startTimeHuman.c_str()); - data.set(NULL, VISIT_COLUMN_END_TIME_HUMAN, endTimeHuman.c_str()); - _D("db: visit table insert interval: (%d, %d): (%s, %s)", - visit.interval.start, visit.interval.end, startTimeHuman.c_str(), endTimeHuman.c_str()); -#else - _D("db: visit table insert interval: (%d, %d)", visit.interval.start, visit.interval.end); -#endif /* TIZEN_ENGINEER_MODE */ - - __putVisitCategsToJson(visit.categs, data); - - int64_t rowId; - bool ret = __dbManager.insertSync(VISIT_TABLE, data, &rowId); - _D("db: visit table insert result: %s", ret ? "SUCCESS" : "FAIL"); - return ret; -} - -void ctx::VisitDetector::onNewLocation(LocationEvent locationEvent) -{ - _D(""); - locationEvent.log(); - __locationEvents.push_back(locationEvent); -}; - -void ctx::VisitDetector::__setPeriod(PlaceRecogMode energyMode) -{ - switch (energyMode) { - case PLACE_RECOG_LOW_POWER_MODE: - __periodSeconds = VISIT_DETECTOR_PERIOD_SECONDS_LOW_POWER; - break; - case PLACE_RECOG_HIGH_ACCURACY_MODE: - __periodSeconds = VISIT_DETECTOR_PERIOD_SECONDS_HIGH_ACCURACY; - break; - default: - _E("Incorrect energy mode"); - } -} - -void ctx::VisitDetector::setMode(PlaceRecogMode energyMode) -{ - _D(""); - __setPeriod(energyMode); - __wifiLogger.setMode(energyMode); -} diff --git a/src/place/recognition/user_places/visit_detector.h b/src/place/recognition/user_places/visit_detector.h deleted file mode 100644 index ee6e7c2..0000000 --- a/src/place/recognition/user_places/visit_detector.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_VISIT_DETECTOR_H_ -#define _CONTEXT_PLACE_RECOGNITION_VISIT_DETECTOR_H_ - -#include -#include -#include -#include -#include -#include "user_places_types.h" -#include -#include -#include "visit_listener_iface.h" -#include "location_logger.h" -#include "location_listener_iface.h" -#include "wifi_listener_iface.h" -#include "wifi_logger.h" - -namespace ctx { - - class VisitDetector : public IWifiListener, ILocationListener { - - private: - bool __testMode; - std::shared_ptr __detectedVisits; // only used in test mode - LocationLogger __locationLogger; - WifiLogger __wifiLogger; - std::vector __listeners; - std::shared_ptr __currentMacEvents; - Interval __currentInterval; - std::vector __locationEvents; - std::vector> __historyFrames; // python: history_scans + history_times - std::vector> __bufferedFrames; // python: buffered_scans + buffered_times - int __stableCounter; - int __tolerance; - bool __entranceToPlace; - int __periodSeconds; - DatabaseManager __dbManager; - - // fields that are used only in case of entrance detection - std::shared_ptr __representativesMacs; // macs that represent the current place - std::shared_ptr __stayMacs; // macs that can appear in the current place - time_t __entranceTime; - time_t __departureTime; - - bool __isValid(const Mac &mac); - void __shiftCurrentInterval(); - void __detectEntranceOrDeparture(std::shared_ptr frame); - void __detectEntrance(std::shared_ptr frame); - void __detectDeparture(std::shared_ptr frame); - void __processBuffer(std::shared_ptr frame); // python: buffer_analysing - std::shared_ptr __makeFrame(std::shared_ptr macEvents, Interval interval); // python: scans2fingerprint - void __resetHistory(); - void __resetHistory(std::shared_ptr frame); - void __visitStartDetected(); - void __visitEndDetected(); - void __putLocationToVisit(Visit &visit); - std::shared_ptr __selectRepresentatives(const std::vector> &frames); - std::shared_ptr __macSetOfGreaterOrEqualShare(const Macs2Shares &macs2Shares, share_t threshold); - std::shared_ptr __macSharesFromCounts(Macs2Counts const &macs2Counts, count_t denominator); // python: response_rate - share_t __calcMaxShare(const Macs2Shares &macs2Shares); - bool __isDisjoint(const Macs2Counts &macs2Counts, const MacSet &macSet); - bool __protrudesFrom(const Macs2Counts &macs2Counts, const MacSet &macSet); - void __setPeriod(PlaceRecogMode mode); - void __processCurrentLogger(); - - /* DATABASE */ - void __dbCreateTable(); - int __dbInsertVisit(Visit visit); - void __putVisitCategToJson(const char* key, const Categs &categs, int categType, Json &data); - void __putVisitCategsToJson(const Categs &categs, Json &data); - - /* INPUT */ - void onWifiScan(MacEvent event); - void onNewLocation(LocationEvent location); - - public: - VisitDetector(time_t startScan, PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE, bool testMode = false); - ~VisitDetector(); - - std::shared_ptr getVisits(); // only used in test mode - void setMode(PlaceRecogMode energyMode); - - }; /* class VisitDetector */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_VISIT_DETECTOR_H_ */ diff --git a/src/place/recognition/user_places/visit_listener_iface.h b/src/place/recognition/user_places/visit_listener_iface.h deleted file mode 100644 index fefc926..0000000 --- a/src/place/recognition/user_places/visit_listener_iface.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_VISIT_LISTENER_IFACE_H_ -#define _CONTEXT_PLACE_RECOGNITION_VISIT_LISTENER_IFACE_H_ - -namespace ctx { - - class IVisitListener { - - public: - virtual ~IVisitListener() {}; - virtual void onVisitStart() = 0; - virtual void onVisitEnd() = 0; - - }; /* class IVisitListener */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_VISIT_LISTENER_IFACE_H_ */ diff --git a/src/place/recognition/user_places/wifi_listener_iface.h b/src/place/recognition/user_places/wifi_listener_iface.h deleted file mode 100644 index 3b883d3..0000000 --- a/src/place/recognition/user_places/wifi_listener_iface.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_WIFI_LISTENER_IFACE_H_ -#define _CONTEXT_PLACE_RECOGNITION_WIFI_LISTENER_IFACE_H_ - -#include "user_places_types.h" - -namespace ctx { - - class IWifiListener { - - public: - virtual ~IWifiListener() {}; - virtual void onWifiScan(ctx::MacEvent macEvent) = 0; - - }; /* IWifiListener */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_WIFI_LISTENER_IFACE_H_ */ diff --git a/src/place/recognition/user_places/wifi_logger.cpp b/src/place/recognition/user_places/wifi_logger.cpp deleted file mode 100644 index 3367276..0000000 --- a/src/place/recognition/user_places/wifi_logger.cpp +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "../place_recognition_types.h" -#include "debug_utils.h" -#include "wifi_logger.h" - -#define __WIFI_CREATE_TABLE_COLUMNS \ - WIFI_COLUMN_TIMESTAMP " timestamp NOT NULL, "\ - WIFI_COLUMN_BSSID " TEXT NOT NULL" - -#define __WIFI_ERROR_LOG(error) { \ - if (error != WIFI_ERROR_NONE) { \ - _E("ERROR == %s", __wifiError2Str(error)); \ - } else { \ - _D("SUCCESS"); \ - } \ -} - -int ctx::WifiLogger::__dbCreateTable() -{ - ctx::DatabaseManager dbManager; - bool ret = dbManager.createTable(0, WIFI_TABLE_NAME, __WIFI_CREATE_TABLE_COLUMNS, NULL, NULL); - _D("Table Creation Request: %s", ret ? "SUCCESS" : "FAIL"); - return ret; -} - -int ctx::WifiLogger::__dbInsertLogs() -{ - if (__logs.size() > 0) { - ctx::DatabaseManager dbManager; - std::stringstream query; - const char* separator = " "; - query << "BEGIN TRANSACTION; \ - INSERT INTO " WIFI_TABLE_NAME " \ - ( " WIFI_COLUMN_BSSID ", " WIFI_COLUMN_TIMESTAMP " ) \ - VALUES"; - for (MacEvent mac_event : __logs) { - query << separator << "( '" << mac_event.mac << "', '" << mac_event.timestamp << "' )"; - separator = ", "; - } - __logs.clear(); - query << "; \ - END TRANSACTION;"; - bool ret = dbManager.execute(0, query.str().c_str(), NULL); - _D("DB insert request: %s", ret ? "SUCCESS" : "FAIL"); - return ret; - } - _D("__logs vector empty -> nothing to insert"); - return 0; -} - -ctx::WifiLogger::WifiLogger(IWifiListener * listener, PlaceRecogMode energyMode, bool testMode) : - __timerOn(false), - __intervalMinutes(WIFI_LOGGER_INTERVAL_MINUTES_HIGH_ACCURACY), - __testMode(testMode), - __listener(listener), - __lastScanTime(time_t(0)), - __lasTimerCallbackTime(time_t(0)), - __duringVisit(false), - __connectedToWifiAp(false), - __started(false), - __running(false) -{ - _D("CONSTRUCTOR"); - if (testMode) { - return; - } - __setInterval(energyMode); - - if (WIFI_LOGGER_DATABASE) { - __dbCreateTable(); - } - - __logs = std::vector(); - - __wifiInitializeRequest(); - __wifiSetDeviceStateChangedCbRequest(); - if (WIFI_LOGGER_LOW_POWER_MODE) { - __wifiSetConnectionStateChangedCbRequest(); - } - wifi_connection_state_e state = __wifiGetConnectionStateRequest(); - __connectedToWifiAp = (state == WIFI_CONNECTION_STATE_CONNECTED); - _D("__connectedToWifiAp = %d, __duringVisit = %d IN CONSTRUCTOR", - static_cast(__connectedToWifiAp), - static_cast(__duringVisit)); -} - -ctx::WifiLogger::~WifiLogger() -{ - _D("DESTRUCTOR"); - stopLogging(); - __wifiDeinitializeRequest(); -} - -void ctx::WifiLogger::__wifiDeviceStateChangedCb(wifi_device_state_e state, void *userData) -{ - ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; - switch (state) { - case WIFI_DEVICE_STATE_DEACTIVATED: - _D("WIFI setting OFF"); - if (wifiLogger->__started) { - wifiLogger->__stopLogging(); - } - break; - case WIFI_DEVICE_STATE_ACTIVATED: - _D("WIFI setting ON"); - if (wifiLogger->__started) { - wifiLogger->__startLogging(); - } - break; - default: - break; - } -} - -void ctx::WifiLogger::__wifiConnectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData) -{ - ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; - switch (state) { - case WIFI_CONNECTION_STATE_CONNECTED: - _D("connected to AP"); - wifiLogger->__connectedToWifiAp = true; - break; - default: - _D("disconnected from AP -> __lastScansPool.clear()"); - wifiLogger->__connectedToWifiAp = false; - wifiLogger->__lastScansPool.clear(); - break; - } - // TODO: Check if AP bssid (MAC Address) will be helpful somehow in LOW_POWER mode -} - -bool ctx::WifiLogger::__wifiFoundApCb(wifi_ap_h ap, void *userData) -{ - ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; - - char *bssid = NULL; - int ret = __wifiApGetBssidRequest(ap, &bssid); - if (ret != WIFI_ERROR_NONE) { - return false; - } - - Mac mac; - try { - mac = Mac(bssid); - } catch (std::runtime_error &e) { - _E("Cannot create mac_event. Exception: %s", e.what()); - return false; - } - - MacEvent log(wifiLogger->__lastScanTime, mac); - if (wifiLogger->__listener) { - wifiLogger->__listener->onWifiScan(log); - if (WIFI_LOGGER_LOW_POWER_MODE - && (wifiLogger->__connectedToWifiAp || wifiLogger->__duringVisit) ) { - // Add to last scans AP's set - wifiLogger->__lastScansPool.insert(std::string(bssid)); - } - } - if (WIFI_LOGGER_DATABASE) { - wifiLogger->__logs.push_back(log); - } - - return true; -} - -const char* ctx::WifiLogger::__wifiError2Str(int error) -{ - switch (error) { - case WIFI_ERROR_INVALID_PARAMETER: - return "WIFI_ERROR_INVALID_PARAMETER"; - case WIFI_ERROR_OUT_OF_MEMORY: - return "WIFI_ERROR_OUT_OF_MEMORY"; - case WIFI_ERROR_INVALID_OPERATION: - return "WIFI_ERROR_INVALID_OPERATION"; - case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: - return "WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED"; - case WIFI_ERROR_OPERATION_FAILED: - return "WIFI_ERROR_OPERATION_FAILED"; - case WIFI_ERROR_NO_CONNECTION: - return "WIFI_ERROR_NO_CONNECTION"; - case WIFI_ERROR_NOW_IN_PROGRESS: - return "WIFI_ERROR_NOW_IN_PROGRESS"; - case WIFI_ERROR_ALREADY_EXISTS: - return "WIFI_ERROR_ALREADY_EXISTS"; - case WIFI_ERROR_OPERATION_ABORTED: - return "WIFI_ERROR_OPERATION_ABORTED"; - case WIFI_ERROR_DHCP_FAILED: - return "WIFI_ERROR_DHCP_FAILED"; - case WIFI_ERROR_INVALID_KEY: - return "WIFI_ERROR_INVALID_KEY"; - case WIFI_ERROR_NO_REPLY: - return "WIFI_ERROR_NO_REPLY"; - case WIFI_ERROR_SECURITY_RESTRICTED: - return "WIFI_ERROR_SECURITY_RESTRICTED"; - case WIFI_ERROR_PERMISSION_DENIED: - return "WIFI_ERROR_PERMISSION_DENIED"; - default: - return "unknown wifi error code"; - } -} - -void ctx::WifiLogger::__wifiScanFinishedCb(wifi_error_e errorCode, void *userData) -{ - ctx::WifiLogger* wifiLogger = (ctx::WifiLogger *)userData; - - time_t now = time(nullptr); -#ifdef TIZEN_ENGINEER_MODE - double seconds = 0; - if (wifiLogger->__lastScanTime > 0) { - seconds = difftime(now, wifiLogger->__lastScanTime); - } - std::string timeStr = DebugUtils::humanReadableDateTime(now, "%T", 9); - _D("__connectedToWifiAp = %d, __duringVisit = %d, __lastScansPool.size() = %d -> scan %s (from last : %.1fs)", - static_cast(wifiLogger->__connectedToWifiAp), - static_cast(wifiLogger->__duringVisit), - wifiLogger->__lastScansPool.size(), - timeStr.c_str(), - seconds); -#endif /* TIZEN_ENGINEER_MODE */ - wifiLogger->__lastScanTime = now; - - int ret = __wifiForeachFoundApsRequest(userData); - if (ret != WIFI_ERROR_NONE) { - return; - } - if (WIFI_LOGGER_DATABASE) { - wifiLogger->__dbInsertLogs(); - } -} - -bool ctx::WifiLogger::__checkWifiIsActivated() -{ - bool wifiActivated = true; - int ret = wifi_is_activated(&wifiActivated); - __WIFI_ERROR_LOG(ret); - _D("Wi-Fi is %s", wifiActivated ? "ON" : "OFF"); - return wifiActivated; -} - -void ctx::WifiLogger::__wifiScanRequest() -{ - int ret = wifi_scan(__wifiScanFinishedCb, this); - __WIFI_ERROR_LOG(ret); -} - -int ctx::WifiLogger::__wifiForeachFoundApsRequest(void *userData) -{ - int ret = wifi_foreach_found_aps(__wifiFoundApCb, userData); - __WIFI_ERROR_LOG(ret); - return ret; -} - -wifi_connection_state_e ctx::WifiLogger::__wifiGetConnectionStateRequest() -{ - wifi_connection_state_e connectionState; - int ret = wifi_get_connection_state(&connectionState); - __WIFI_ERROR_LOG(ret); - return connectionState; -} - -void ctx::WifiLogger::__wifiSetBackgroundScanCbRequest() -{ - int ret = wifi_set_background_scan_cb(__wifiScanFinishedCb, this); - __WIFI_ERROR_LOG(ret); -} - -void ctx::WifiLogger::__wifiSetDeviceStateChangedCbRequest() -{ - int ret = wifi_set_device_state_changed_cb(__wifiDeviceStateChangedCb, this); - __WIFI_ERROR_LOG(ret); -} - -void ctx::WifiLogger::__wifiSetConnectionStateChangedCbRequest() -{ - int ret = wifi_set_connection_state_changed_cb(__wifiConnectionStateChangedCb, this); - __WIFI_ERROR_LOG(ret); -} - -int ctx::WifiLogger::__wifiApGetBssidRequest(wifi_ap_h ap, char **bssid) -{ - int ret = wifi_ap_get_bssid(ap, bssid); - __WIFI_ERROR_LOG(ret); - return ret; -} - -void ctx::WifiLogger::__wifiInitializeRequest() -{ - int ret = wifi_initialize(); - __WIFI_ERROR_LOG(ret); -} - -void ctx::WifiLogger::__wifiDeinitializeRequest() -{ - int ret = wifi_deinitialize(); - __WIFI_ERROR_LOG(ret); -} - -bool ctx::WifiLogger::__checkTimerId(int id) -{ - _D("id == %d, __timerId == %d", id, __timerId); - return id == __timerId; -} - -/* - * Accepted time from last callback is >= than minimum interval - */ -bool ctx::WifiLogger::__checkTimerTime(time_t now) -{ - double seconds = 0; - if (__lasTimerCallbackTime > 0) { - seconds = difftime(now, __lasTimerCallbackTime); - if (seconds < WIFI_LOGGER_ACTIVE_SCANNING_MIN_INTERVAL) { - _D("last == %d, now == %d, diff = %.1fs -> Incorrect timer callback", __lasTimerCallbackTime, now, seconds); - return false; - } else { - _D("last == %d, now == %d, diff = %.1fs -> Correct timer callback", __lasTimerCallbackTime, now, seconds); - } - } else { - _D("last == %d, now == %d -> First callback", __lasTimerCallbackTime, now); - } - __lasTimerCallbackTime = now; - return true; -} - -bool ctx::WifiLogger::onTimerExpired(int id) -{ - time_t now = time(nullptr); - _D(""); - if (__checkTimerId(id) == false) { - // Incorrect callback call - return false; - } - if (__checkTimerTime(now) == false) { - // Prevention from double callback call bug - return __timerOn; - } - _D("__connectedToWifiAp = %d, __duringVisit = %d, __lastScansPool.size() = %d", - static_cast(__connectedToWifiAp), - static_cast(__duringVisit), - __lastScansPool.size()); - if (WIFI_LOGGER_LOW_POWER_MODE - && __duringVisit - && __connectedToWifiAp - && __lastScansPool.size() > 0) { - _D("trying to send fake scan"); - if (__listener) { - _D("__listener != false -> CORRECT"); - for (std::string bssid : __lastScansPool) { - Mac mac(bssid); - MacEvent scan(now, mac); - _D("send fake scan (%s)", bssid.c_str()); - __listener->onWifiScan(scan); - } - } - } else { - __wifiScanRequest(); - } - return __timerOn; -} - -void ctx::WifiLogger::startLogging() -{ - _D(""); - __started = true; - __startLogging(); -} - -void ctx::WifiLogger::__startLogging() -{ - _D(""); - if (!__checkWifiIsActivated() || __running) { - return; - } - __running = true; - - if (WIFI_LOGGER_ACTIVE_SCANNING) { - __timerStart(__intervalMinutes); - __wifiScanRequest(); - } - if (WIFI_LOGGER_PASSIVE_SCANNING) { - __wifiSetBackgroundScanCbRequest(); - } -} - -void ctx::WifiLogger::stopLogging() -{ - _D(""); - __started = false; - __stopLogging(); -} - -void ctx::WifiLogger::__stopLogging() -{ - _D(""); - if (!__running) { - return; - } - if (WIFI_LOGGER_ACTIVE_SCANNING) { - // Unset timer - __timerOn = false; - // Remove timer - __timerManager.remove(__timerId); - } - if (WIFI_LOGGER_PASSIVE_SCANNING) { - wifi_unset_background_scan_cb(); - } - __running = false; -} - -void ctx::WifiLogger::__timerStart(time_t minutes) -{ - __timerOn = true; - __timerId = __timerManager.setFor(minutes, this); - _D("%s (minutes=%d)", __timerId >= 0 ? "SUCCESS" : "ERROR", minutes); -} - -void ctx::WifiLogger::onVisitStart() -{ - _D(""); - __duringVisit = true; -} - -void ctx::WifiLogger::onVisitEnd() -{ - _D("__lastScansPool.clear()"); - __duringVisit = false; - __lastScansPool.clear(); -} - -void ctx::WifiLogger::__setInterval(PlaceRecogMode energyMode) -{ - switch (energyMode) { - case PLACE_RECOG_LOW_POWER_MODE: - __intervalMinutes = WIFI_LOGGER_INTERVAL_MINUTES_LOW_POWER; - break; - case PLACE_RECOG_HIGH_ACCURACY_MODE: - __intervalMinutes = WIFI_LOGGER_INTERVAL_MINUTES_HIGH_ACCURACY; - break; - default: - _E("Incorrect energy mode"); - } -} - -void ctx::WifiLogger::__timerRestart() -{ - __timerManager.remove(__timerId); - __timerStart(__intervalMinutes); -} - -void ctx::WifiLogger::setMode(PlaceRecogMode energyMode) -{ - _D(""); - __setInterval(energyMode); - if (WIFI_LOGGER_ACTIVE_SCANNING && __timerOn) { - __timerRestart(); - } -} diff --git a/src/place/recognition/user_places/wifi_logger.h b/src/place/recognition/user_places/wifi_logger.h deleted file mode 100644 index 9938a2c..0000000 --- a/src/place/recognition/user_places/wifi_logger.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_PLACE_RECOGNITION_WIFI_LOGGER_H_ -#define _CONTEXT_PLACE_RECOGNITION_WIFI_LOGGER_H_ - -#include -#include -#include -#include -#include -#include "wifi_listener_iface.h" -#include "visit_listener_iface.h" -#include "user_places_params.h" - -/* Database usage flag */ -#define WIFI_LOGGER_DATABASE false - -/* Active scanning usage flag */ -#define WIFI_LOGGER_ACTIVE_SCANNING true - -/* Passive scanning usage flag */ -#define WIFI_LOGGER_PASSIVE_SCANNING true - -/* Active scanning minimum interval in seconds */ -#define WIFI_LOGGER_ACTIVE_SCANNING_MIN_INTERVAL 10 - -/* - * Low power scanning usage flag - * (When phone is connected to some WiFi Access Point - * last scan data is returned instead of new scan triggering) - */ -#define WIFI_LOGGER_LOW_POWER_MODE false - -namespace ctx { - - class WifiLogger : public ITimerListener, public IVisitListener { - - public: - WifiLogger(IWifiListener * listener = nullptr, - PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE, - bool testMode = false); - ~WifiLogger(); - - void startLogging(); - void stopLogging(); - void setMode(PlaceRecogMode energyMode); - - private: - /* INPUT */ - void onVisitStart(); - void onVisitEnd(); - - bool onTimerExpired(int timerId); - - /* TIMER */ - bool __timerOn; - int __timerId; - int __intervalMinutes; - TimerManager __timerManager; - void __setInterval(PlaceRecogMode energyMode); - bool __checkTimerId(int id); - bool __checkTimerTime(time_t now); - void __timerStart(time_t minutes); - void __timerRestart(); - - /* DATABASE */ - static int __dbCreateTable(); - int __dbInsertLogs(); - - /* SYSTEM CAPI WRAPPERS */ - void __wifiSetBackgroundScanCbRequest(); - void __wifiSetDeviceStateChangedCbRequest(); - void __wifiSetConnectionStateChangedCbRequest(); - static bool __checkWifiIsActivated(); - void __wifiScanRequest(); - static int __wifiForeachFoundApsRequest(void *userData); - static wifi_connection_state_e __wifiGetConnectionStateRequest(); - static int __wifiApGetBssidRequest(wifi_ap_h ap, char **bssid); - void __wifiInitializeRequest(); - void __wifiDeinitializeRequest(); - - /* SYSTEM CAPI CALLBACKS */ - static void __wifiDeviceStateChangedCb(wifi_device_state_e state, void *userData); - static void __wifiConnectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData); - static bool __wifiFoundApCb(wifi_ap_h ap, void *userData); - static void __wifiScanFinishedCb(wifi_error_e errorCode, void *userData); - - bool __testMode; - IWifiListener * const __listener; - std::vector __logs; - std::set __lastScansPool; - time_t __lastScanTime; - time_t __lasTimerCallbackTime; - bool __duringVisit; - bool __connectedToWifiAp; - bool __started; - bool __running; - - void __startLogging(); - void __stopLogging(); - static const char* __wifiError2Str(int error); - - }; /* class WifiLogger */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_PLACE_RECOGNITION_WIFI_LOGGER_H_ */ diff --git a/src/prediction/assoc_rule.cpp b/src/prediction/assoc_rule.cpp new file mode 100644 index 0000000..05be246 --- /dev/null +++ b/src/prediction/assoc_rule.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "assoc_rule.h" + +std::ostream& ctx::operator<<(std::ostream &out, const ctx::AssocRule &rule) +{ + return out << rule.antecedent << " => " << rule.consequent + << "; support:" << rule.support << "; confidence:" << rule.confidence; +} + +bool ctx::operator==(const ctx::AssocRule& left, const ctx::AssocRule& right) +{ + return left.antecedent == right.antecedent && + left.consequent == right.consequent && + left.support == right.support && + left.confidence == right.confidence; +} diff --git a/src/prediction/assoc_rule.h b/src/prediction/assoc_rule.h new file mode 100644 index 0000000..20d195d --- /dev/null +++ b/src/prediction/assoc_rule.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_H_ +#define _PREDICTION_ASSOC_RULE_H_ + +#include "item_set.h" +#include + +namespace ctx { + + struct AssocRule { + ItemSet antecedent; + ItemSet consequent; + double support; + double confidence; + + AssocRule(const ItemSet& antecedent_, + const ItemSet& consequent_, + const double& support_, + const double& confidence_) + : antecedent(antecedent_) + , consequent(consequent_) + , support(support_) + , confidence(confidence_) {} + }; + + bool operator==(const AssocRule& left, const AssocRule& right); + + std::ostream& operator<<(std::ostream &out, const AssocRule &rule); + +} /* namespace ctx */ + +#endif /* _PREDICTION_ASSOC_RULE_H_ */ diff --git a/src/prediction/assoc_rule_miner.cpp b/src/prediction/assoc_rule_miner.cpp new file mode 100644 index 0000000..a639af8 --- /dev/null +++ b/src/prediction/assoc_rule_miner.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "assoc_rule_miner.h" +#include "single_category_item_id_filter.h" +#include "basket_filter.h" +#include "basket_compressor.h" +#include "baskets_agregator.h" +#include "assoc_rule_producer.h" +#include "weight_apriori.h" + +std::list ctx::AssocRuleMiner::mine_from_baskets( + std::list& initBaskets, + ctx::ItemCatalogue& itemCatalogue, + double minSupport, + double minConfidence, + std::string consequentCategory) +{ + SingleCategoryItemIdFilter itemIdFilter(consequentCategory, itemCatalogue); + BasketFilter::filter_in_place(initBaskets,itemIdFilter); + + std::list compressedBaskets = BasketCompressor::compress(initBaskets); + + BasketsAgregator basketsAgregator(compressedBaskets); + basketsAgregator.generate_bitsets(itemCatalogue.maxId()); + auto freqItemSets = WeightApriori::find_frequent_itemid_sets(basketsAgregator, minSupport); + auto rulesOfIds = AssocRuleProducer::generate_rules(freqItemSets, itemIdFilter, minConfidence); + return remove_assoc_rule_ids(rulesOfIds, itemCatalogue); +} + +std::list ctx::AssocRuleMiner::mine_from_events( + const ctx::EventSet& events, + double minSupport, + double minConfidence, + std::string consequentCategory) +{ + ItemCatalogue itemCatalogue; + + BasketProducer basketProducer(itemCatalogue); + for (auto& event : events) { + basketProducer.put_event(event); + } + + std::list initBaskets = basketProducer.make_baskets(); + + return mine_from_baskets(initBaskets, itemCatalogue, minSupport, minConfidence, consequentCategory); +} + +std::list ctx::AssocRuleMiner::remove_assoc_rule_ids( + const std::list& rulesOfIds, + const ctx::ItemCatalogue& itemCatalogue) +{ + std::list result; + for (const AssocRuleOfIds ruleOfIds : rulesOfIds) { + AssocRule rule(remove_assoc_rule_ids(ruleOfIds.antecedent, itemCatalogue), + remove_assoc_rule_ids(ruleOfIds.consequent, itemCatalogue), + ruleOfIds.support, + ruleOfIds.confidence); + result.push_back(rule); + } + return result; +} + +ctx::ItemSet ctx::AssocRuleMiner::remove_assoc_rule_ids(const ctx::ItemIdSet& itemIdSet, const ctx::ItemCatalogue& itemCatalogue) +{ + ItemSet itemSet; + for (int id : itemIdSet) { + itemSet.push_back(itemCatalogue.item_of_id(id)); + } + return itemSet; +} diff --git a/src/prediction/assoc_rule_miner.h b/src/prediction/assoc_rule_miner.h new file mode 100644 index 0000000..a9c9e97 --- /dev/null +++ b/src/prediction/assoc_rule_miner.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_MINER_H_ +#define _PREDICTION_ASSOC_RULE_MINER_H_ + +#include +#include +#include "event_set.h" +#include "assoc_rule.h" +#include "assoc_rule_of_ids.h" +#include "basket_producer.h" +#include "i_item_id_filter.h" + +namespace ctx { + + class AssocRuleMiner { + + public: + static std::list mine_from_events( + const EventSet& events, + double minSupport, + double minConfidence, + std::string consequentCategory); + static std::list mine_from_baskets( + std::list& initBaskets, + ItemCatalogue& itemCatalogue, + double minSupport, + double minConfidence, + std::string consequentCategory); + private: + static std::list remove_assoc_rule_ids(const std::list& rulesOfIds, const ItemCatalogue& itemCatalogue); + static ItemSet remove_assoc_rule_ids(const ItemIdSet& itemIdSet, const ItemCatalogue& itemCatalogue); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_ASSOC_RULE_MINER_H_ */ diff --git a/src/prediction/assoc_rule_of_ids.h b/src/prediction/assoc_rule_of_ids.h new file mode 100644 index 0000000..9597a55 --- /dev/null +++ b/src/prediction/assoc_rule_of_ids.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_OF_IDS_H_ +#define _PREDICTION_ASSOC_RULE_OF_IDS_H_ + +#include "item_id_set.h" + +namespace ctx { + + /* rule of the form antecedent => consequent */ + class AssocRuleOfIds { + + public: + ItemIdSet antecedent; + ItemIdSet consequent; + double support; + double confidence; + }; + + inline bool operator==(const AssocRuleOfIds& left, const AssocRuleOfIds& right) + { + return left.support == right.support + && left.confidence == right.confidence + && left.antecedent == right.antecedent + && left.consequent == right.consequent; + } + +} /* namespace ctx */ + +#endif /* _PREDICTION_ASSOC_RULE_OF_IDS_H_ */ diff --git a/src/prediction/assoc_rule_producer.cpp b/src/prediction/assoc_rule_producer.cpp new file mode 100644 index 0000000..da9f5d2 --- /dev/null +++ b/src/prediction/assoc_rule_producer.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "assoc_rule_producer.h" + +ctx::AssocRuleOfIds ctx::AssocRuleProducer::rule_template(const ctx::ItemIdSet& sourceItemIdSet, + const ctx::IItemIdFilter& itemIdFilter) +{ + AssocRuleOfIds ruleTempl; + for (int itemId : sourceItemIdSet) { + ItemIdSet &destination = itemIdFilter.pass(itemId) + ? ruleTempl.consequent + : ruleTempl.antecedent; + destination.push_back(itemId); + } + return ruleTempl; +} + +std::list ctx::AssocRuleProducer::generate_rules( + const std::list>& freqItemIdSets, + const ctx::IItemIdFilter& itemIdFilter, double minConfidence) +{ + std::list rules; + + for (auto & pair : freqItemIdSets) { + ItemIdSet freqItemIdSet = pair.first; + double support = pair.second; + AssocRuleOfIds rule = AssocRuleProducer::rule_template(freqItemIdSet, itemIdFilter); + if (rule.antecedent.size() > 0 && rule.consequent.size() > 0) { + rule.support = support; + double antecedentSupport = AssocRuleProducer::supportOf(freqItemIdSets, rule.antecedent); + rule.confidence = support / antecedentSupport; + if (rule.confidence >= minConfidence) { + rules.push_back(rule); + } + } + } + return rules; +} + +double ctx::AssocRuleProducer::supportOf( + const std::list> &allFreqItemIdSets, const ctx::ItemIdSet &wanted) +{ + for (auto & pair : allFreqItemIdSets) { + if (pair.first == wanted) { + return pair.second; + } + } + return 0.0; +} diff --git a/src/prediction/assoc_rule_producer.h b/src/prediction/assoc_rule_producer.h new file mode 100644 index 0000000..2b02b79 --- /dev/null +++ b/src/prediction/assoc_rule_producer.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_PRODUCER_H_ +#define _PREDICTION_ASSOC_RULE_PRODUCER_H_ + +#include "assoc_rule_of_ids.h" +#include "basket.h" +#include "i_item_id_filter.h" +#include + +namespace ctx { + + class AssocRuleProducer { + + public: + static std::list generate_rules( + const std::list> &freqItemIdSets, + const IItemIdFilter &itemIdFilter, + double minConfidence); + + static AssocRuleOfIds rule_template(const ItemIdSet &sourceItemIdSet, const IItemIdFilter &antecedentItemIdFilter); + + private: + static double supportOf(const std::list> &allFreqItemIdSets, const ItemIdSet &wanted); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_ASSOC_RULE_PRODUCER_H_ */ diff --git a/src/prediction/basket.cpp b/src/prediction/basket.cpp new file mode 100644 index 0000000..35357ce --- /dev/null +++ b/src/prediction/basket.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "basket.h" + +void ctx::Basket::compute_bitset(int maxId) +{ + mBitSet.resize(maxId+1, false); + for (int itemId : itemIdSet) { + mBitSet[itemId] = true; + } +} + +bool ctx::Basket::includes(const ctx::ItemIdSet& potentialSubset) +{ + for (int itemId : potentialSubset) { + if (!mBitSet[itemId]) { + return false; + } + } + return true; +} diff --git a/src/prediction/basket.h b/src/prediction/basket.h new file mode 100644 index 0000000..1adb851 --- /dev/null +++ b/src/prediction/basket.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_BASKET_H_ +#define _PREDICTION_BASKET_H_ + +#include "item_id_set.h" +#include + +namespace ctx { + + class Basket { + + public: + ItemIdSet itemIdSet; + int weight; + + Basket(const ItemIdSet& itemIdSet_, const int& weight_) : itemIdSet(itemIdSet_), weight(weight_) {}; + void compute_bitset(int maxId); + bool includes(const ItemIdSet& potentialSubset); // compute_bitset() should be invoked first + + private: + std::vector mBitSet; + + }; + + // TODO If there is no "inline" below the project does not compile. + inline bool operator==(const Basket& left, const Basket& right) + { + return left.weight == right.weight && left.itemIdSet == right.itemIdSet; + } + +} /* namespace ctx */ + +#endif /* _PREDICTION_BASKET_H_ */ diff --git a/src/prediction/basket_compressor.cpp b/src/prediction/basket_compressor.cpp new file mode 100644 index 0000000..f46c40d --- /dev/null +++ b/src/prediction/basket_compressor.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "basket_compressor.h" +#include +#include + +std::string ctx::BasketCompressor::itemset_string(const ctx::ItemIdSet& itemIdSet) +{ + std::stringstream ss; + for (int itemId : itemIdSet) { + ss << itemId << ','; + } + return ss.str(); +} + +std::list ctx::BasketCompressor::compress(const std::list& inputBaskets) +{ + std::map basketsMap; + // TODO: maybe it is worth to resign from string keys and use std::map instead. + + for (const Basket& basket : inputBaskets) { + std::string itemSetStr = itemset_string(basket.itemIdSet); + + auto findResult = basketsMap.find(itemSetStr); + if (findResult == basketsMap.end()) { + basketsMap.insert(std::pair(itemSetStr, basket)); + } else { + Basket& compressedBasket = findResult->second; + compressedBasket.weight += basket.weight; + } + } + + std::list compressedBaskets; + for (auto pair : basketsMap) { + compressedBaskets.push_back(pair.second); + } + return compressedBaskets; +} diff --git a/src/prediction/basket_compressor.h b/src/prediction/basket_compressor.h new file mode 100644 index 0000000..776f074 --- /dev/null +++ b/src/prediction/basket_compressor.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_BASKET_COMPRESSOR_H_ +#define _PREDICTION_BASKET_COMPRESSOR_H_ + +#include +#include +#include "basket.h" + +namespace ctx { + + class BasketCompressor { + + public: + static std::list compress(const std::list &inputBaskets); + + private: + static std::string itemset_string(const ItemIdSet &itemIdSet); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_BASKET_COMPRESSOR_H_ */ diff --git a/src/prediction/basket_filter.cpp b/src/prediction/basket_filter.cpp new file mode 100644 index 0000000..da03b6c --- /dev/null +++ b/src/prediction/basket_filter.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "basket_filter.h" + +void ctx::BasketFilter::filter_in_place(std::list& baskets, const ctx::IItemIdFilter& itemIdFilter) +{ + baskets.remove_if([&itemIdFilter] (Basket &basket) -> bool { return !BasketPass(basket, itemIdFilter); }); +} + +bool ctx::BasketFilter::BasketPass(const ctx::Basket& basket, const ctx::IItemIdFilter& itemIdFilter) +{ + for (int itemId : basket.itemIdSet) { + if (itemIdFilter.pass(itemId)) { + return true; + } + } + return false; +} diff --git a/src/prediction/basket_filter.h b/src/prediction/basket_filter.h new file mode 100644 index 0000000..6f8a114 --- /dev/null +++ b/src/prediction/basket_filter.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_BASKET_FILTER_H_ +#define _PREDICTION_BASKET_FILTER_H_ + +#include "basket.h" +#include "i_item_id_filter.h" +#include + +namespace ctx { + + class BasketFilter { + + public: + static void filter_in_place(std::list &inputBaskets, const IItemIdFilter &itemIdFilter); + + private: + static bool BasketPass(const Basket &basket, const IItemIdFilter &itemIdFilter); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_BASKET_FILTER_H_ */ diff --git a/src/prediction/basket_producer.cpp b/src/prediction/basket_producer.cpp new file mode 100644 index 0000000..99a3af9 --- /dev/null +++ b/src/prediction/basket_producer.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "basket_producer.h" +#include + +void ctx::BasketProducer::put_event(const ctx::Event& event) +{ + int iid = mItemCatalogue.id_of(event.item); + put_change(event.interval.start, iid); // positive value indicates start + put_change(event.interval.end, -iid); // negative value indicates end +} + +std::list ctx::BasketProducer::make_baskets() +{ + std::list baskets; + + time_t intervalStart; + std::set currentItemIds; + + bool first = true; + for (auto changePair : mChanges) { + if (first) { + first = false; + } else { + time_t intervalEnd = changePair.first; + int weight = intervalEnd - intervalStart; + ItemIdSet itemIdSet; + for (int itemId : currentItemIds) { + itemIdSet.push_back(itemId); + } + baskets.push_back(Basket(itemIdSet, weight)); + } + + for (int itemId : changePair.second) { + if (itemId > 0) { // item with itemId starts now + currentItemIds.insert(itemId); + } else { // item with -itemId ends now + currentItemIds.erase(-itemId); + } + } + + intervalStart = changePair.first; + } + + return baskets; +} + +void ctx::BasketProducer::put_change(time_t time, int value) +{ + if (mChanges.find(time) == mChanges.end()) { + mChanges[time] = std::list(); + } + mChanges[time].push_back(value); +} diff --git a/src/prediction/basket_producer.h b/src/prediction/basket_producer.h new file mode 100644 index 0000000..f2c9757 --- /dev/null +++ b/src/prediction/basket_producer.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_BASKET_PRODUCER_H_ +#define _PREDICTION_BASKET_PRODUCER_H_ + +#include "event.h" +#include "basket.h" +#include "item_catalogue.h" +#include + +namespace ctx { + + class BasketProducer { + + public: + BasketProducer(ItemCatalogue& itemCatalogue) : mItemCatalogue(itemCatalogue) {}; + void put_event(const Event& e); + std::list make_baskets(); + + private: + void put_change(time_t time, int value); + + ItemCatalogue& mItemCatalogue; + + /* + * Changes in timestamps. + * If an item starts than its id is stored. + * If an item ends than its negated id is stored. + */ + std::map> mChanges; + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_BASKET_PRODUCER_H_ */ diff --git a/src/prediction/baskets_agregator.cpp b/src/prediction/baskets_agregator.cpp new file mode 100644 index 0000000..7a57e9b --- /dev/null +++ b/src/prediction/baskets_agregator.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "baskets_agregator.h" + +ctx::BasketsAgregator::BasketsAgregator(std::list& baskets) : mBaskets(baskets) +{ +} + +ctx::ItemIdSet ctx::BasketsAgregator::unique_item_ids() +{ + ItemIdSet allItemIds; + for (const Basket& basket : mBaskets) { + for (int itemId : basket.itemIdSet) { + allItemIds.push_back(itemId); + } + } + allItemIds.sort(); + allItemIds.unique(); + return allItemIds; +} + +void ctx::BasketsAgregator::generate_bitsets(int maxId) +{ + for (Basket& basket : mBaskets) { + basket.compute_bitset(maxId); + } +} + +double ctx::BasketsAgregator::supportOf(const ctx::ItemIdSet& itemIdSet) +{ + int matchedCount = 0; + int unmatchedCount = 0; + for (Basket& basket : mBaskets) { + if (basket.includes(itemIdSet)) { + matchedCount += basket.weight; + } else { + unmatchedCount += basket.weight; + } + } + return (double) matchedCount / (double) (matchedCount + unmatchedCount); +} diff --git a/src/prediction/baskets_agregator.h b/src/prediction/baskets_agregator.h new file mode 100644 index 0000000..5ce18c0 --- /dev/null +++ b/src/prediction/baskets_agregator.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_BASKETS_AGREGATOR_H_ +#define _PREDICTION_BASKETS_AGREGATOR_H_ + +#include +#include +#include "basket.h" + +namespace ctx { + + class BasketsAgregator { + + public: + BasketsAgregator(std::list& baskets); + void generate_bitsets(int maxId); + ItemIdSet unique_item_ids(); + double supportOf(const ItemIdSet &itemIdSet); + + private: + std::list& mBaskets; + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_BASKETS_AGREGATOR_H_ */ diff --git a/src/prediction/event.cpp b/src/prediction/event.cpp new file mode 100644 index 0000000..817e108 --- /dev/null +++ b/src/prediction/event.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "event.h" + +bool ctx::operator==(const ctx::Event& left, const ctx::Event& right) +{ + return left.item == right.item && left.interval == right.interval; +} + +bool ctx::operator!=(const ctx::Event& left, const ctx::Event& right) +{ + return !(left == right); +} diff --git a/src/prediction/event.h b/src/prediction/event.h new file mode 100644 index 0000000..99048e4 --- /dev/null +++ b/src/prediction/event.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_EVENT_H_ +#define _PREDICTION_EVENT_H_ + +#include "item.h" +#include "interval.h" + +namespace ctx { + + struct Event { + Item item; + Interval interval; + + /* long time event */ + Event(const Item& item_, const Interval& interval_) : item(item_), interval(interval_) {} + + /* instant event */ + Event(const Item& item_, const time_t& start_time_) : item(item_), interval(start_time_, start_time_ + 1) {} + }; + + bool operator==(const Event& left, const Event& right); + bool operator!=(const Event& left, const Event& right); + +} /* namespace ctx */ + +#endif /* _PREDICTION_EVENT_H_ */ diff --git a/src/prediction/event_set.h b/src/prediction/event_set.h new file mode 100644 index 0000000..e097ece --- /dev/null +++ b/src/prediction/event_set.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_EVENT_SET_H_ +#define _PREDICTION_EVENT_SET_H_ + +#include "event.h" + +namespace ctx { + + typedef std::list EventSet; + +} /* namespace ctx */ + +#endif /* _PREDICTION_EVENT_SET_H_ */ diff --git a/src/prediction/i_item_id_filter.h b/src/prediction/i_item_id_filter.h new file mode 100644 index 0000000..1a8ac45 --- /dev/null +++ b/src/prediction/i_item_id_filter.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_I_ITEM_ID_FILTER_H_ +#define _PREDICTION_I_ITEM_ID_FILTER_H_ + +namespace ctx { + + class IItemIdFilter { + + public: + virtual ~IItemIdFilter() {} + virtual bool pass(int itemId) const = 0; + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_I_ITEM_ID_FILTER_H_ */ diff --git a/src/prediction/interval.cpp b/src/prediction/interval.cpp new file mode 100644 index 0000000..b6dc8f9 --- /dev/null +++ b/src/prediction/interval.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "interval.h" + +bool ctx::operator==(const Interval& left, const Interval& right) +{ + return left.start == right.start && left.end == right.end; +} + +bool ctx::operator!=(const Interval& left, const Interval& right) +{ + return !(left == right); +} diff --git a/src/prediction/interval.h b/src/prediction/interval.h new file mode 100644 index 0000000..3576da1 --- /dev/null +++ b/src/prediction/interval.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_INTERVAL_H_ +#define _PREDICTION_INTERVAL_H_ + +#include + +namespace ctx { + + struct Interval { + time_t start; + time_t end; + + Interval(time_t start_, time_t end_) : start(start_), end(end_) {} + }; + + bool operator==(const Interval& left, const Interval& right); + bool operator!=(const Interval& left, const Interval& right); + +} /* namespace ctx */ + +#endif /* _PREDICTION_INTERVAL_H_ */ diff --git a/src/prediction/item.cpp b/src/prediction/item.cpp new file mode 100644 index 0000000..9a80ca9 --- /dev/null +++ b/src/prediction/item.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "item.h" + +ctx::Item::Item(const std::string &s) +{ + size_t leftBracket = s.find('['); + size_t rightBracket = s.find(']', leftBracket); + category = s.substr(leftBracket + 1, rightBracket - 1); + value = s.substr(rightBracket + 1); + return; +} + +bool ctx::Item::operator==(const ctx::Item& other) const +{ + return other.category == category && other.value == value; +} + +bool ctx::Item::operator!=(const ctx::Item& other) const +{ + return !operator==(other); +} + +std::ostream& ctx::operator<<(std::ostream& out, const ctx::Item& item) +{ + return out << '[' << item.category << ']' << item.value; +} diff --git a/src/prediction/item.h b/src/prediction/item.h new file mode 100644 index 0000000..0e933ce --- /dev/null +++ b/src/prediction/item.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ITEM_H_ +#define _PREDICTION_ITEM_H_ + +#include +#include + +namespace ctx { + + struct Item { + std::string category; + std::string value; + + Item(const std::string &category_, const std::string &value_) : category(category_), value(value_) {} + Item(const std::string &s); // in the form of "[Category]Value" + + bool operator==(const Item& other) const; + bool operator!=(const Item& other) const; + }; + + std::ostream& operator<<(std::ostream& out, const Item& item); + +} /* namespace ctx */ + +namespace std { + + template <> struct hash { + size_t operator()(const ctx::Item &item) const { + hash hasher; + return hasher(item.category + ":" + item.value); + } + }; + +} + +#endif /* _PREDICTION_ITEM_H_ */ diff --git a/src/prediction/item_catalogue.cpp b/src/prediction/item_catalogue.cpp new file mode 100644 index 0000000..666b5a8 --- /dev/null +++ b/src/prediction/item_catalogue.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "item_catalogue.h" +#include "item_string_converter.h" + +int ctx::ItemCatalogue::id_of(const ctx::Item& item) +{ + std::string s = ItemStringConverter::item_to_string(item); + std::map::iterator it = mItemIdsOfStrings.find(s); + if (it == mItemIdsOfStrings.end()) { // new item + mMaxId++; + mItemIdsOfStrings[s] = mMaxId; + mItemStrings.push_back(s); + extendCategoryItemIds(item.category, mMaxId); + return mMaxId; + } else { // existing item + return mItemIdsOfStrings[s]; + } +} + +bool ctx::ItemCatalogue::exists_item_of_id(int id) const +{ + return id > 0 && id <= mMaxId; +} + +ctx::Item ctx::ItemCatalogue::item_of_id(int id) const +{ + return ItemStringConverter::string_to_item(mItemStrings[id]); +} + +std::set ctx::ItemCatalogue::category_item_ids(std::string category) const +{ + auto it = mCategoryItemIds.find(category); + if (it == mCategoryItemIds.end()) { + return std::set(); + } else { + return it->second; + } +} + +void ctx::ItemCatalogue::extendCategoryItemIds(std::string category, int itemId) +{ + if (mCategoryItemIds.find(category) == mCategoryItemIds.end()) { + mCategoryItemIds[category] = std::set(); + } + mCategoryItemIds[category].insert(itemId); +} diff --git a/src/prediction/item_catalogue.h b/src/prediction/item_catalogue.h new file mode 100644 index 0000000..404765b --- /dev/null +++ b/src/prediction/item_catalogue.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ITEM_CATALOGUE_H_ +#define _PREDICTION_ITEM_CATALOGUE_H_ + +#include "item.h" +#include +#include +#include + +namespace ctx { + + class ItemCatalogue { + + public: + ItemCatalogue() : mMaxId(0) { + mItemStrings.push_back(std::string("")); + } + + int id_of(Item const &item); + + bool exists_item_of_id(int id) const; + Item item_of_id(int id) const; + std::set category_item_ids(std::string category) const; + int maxId() const {return mMaxId;}; + + private: + /* Translates item string to its id */ + std::map mItemIdsOfStrings; + + /* Translating category string to int */ + std::map> mCategoryItemIds; + + /* Stores item strings (index is item's id) */ + std::vector mItemStrings; + + /* Preserves maximal item's id */ + int mMaxId; + + void extendCategoryItemIds(std::string category, int itemId); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_ITEM_CATALOGUE_H_ */ diff --git a/src/prediction/item_id_set.h b/src/prediction/item_id_set.h new file mode 100644 index 0000000..ce18f71 --- /dev/null +++ b/src/prediction/item_id_set.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ITEM_ID_SET_H_ +#define _PREDICTION_ITEM_ID_SET_H_ + +#include + +namespace ctx { + + /* A set storing item ids */ + typedef std::list ItemIdSet; + +} /* namespace ctx */ + +#endif /* _PREDICTION_ITEM_ID_SET_H_ */ diff --git a/src/prediction/item_set.cpp b/src/prediction/item_set.cpp new file mode 100644 index 0000000..dccee66 --- /dev/null +++ b/src/prediction/item_set.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "item_set.h" +#include + +std::ostream& ctx::operator<<(std::ostream& out, const ctx::ItemSet& itemSet) +{ + bool first = true; + for (auto& item : itemSet) { + if (first) { + first = false; + } else { + out << ", "; + } + out << item; + } + return out; +} + +bool ctx::itemset_includes_in(const ctx::ItemSet& small, const ctx::ItemSet& big) +{ + for (const Item& s : small) { + if (std::find(big.begin(), big.end(), s) == big.end()) + return false; + } + return true; +} diff --git a/src/prediction/item_set.h b/src/prediction/item_set.h new file mode 100644 index 0000000..f13c8bc --- /dev/null +++ b/src/prediction/item_set.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ITEM_SET_H_ +#define _PREDICTION_ITEM_SET_H_ + +#include +#include "item.h" + +namespace ctx { + + /* A set storing item ids */ + typedef std::list ItemSet; + + std::ostream& operator<<(std::ostream& out, const ItemSet& itemSet); + + bool itemset_includes_in(const ItemSet& small, const ItemSet& big); + +} /* namespace ctx */ + +#endif /* _PREDICTION_ITEM_SET_H_ */ diff --git a/src/prediction/item_string_converter.cpp b/src/prediction/item_string_converter.cpp new file mode 100644 index 0000000..399847a --- /dev/null +++ b/src/prediction/item_string_converter.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "item_string_converter.h" +#include + +std::string ctx::ItemStringConverter::item_to_string(const ctx::Item &item) +{ + return item.category + SEPARATOR + item.value; +} + +ctx::Item ctx::ItemStringConverter::string_to_item(const std::string& s) +{ + size_t pos = s.find(SEPARATOR); + //assert(pos != std::string::npos); + return Item(s.substr(0, pos), s.substr(pos + 1)); +} diff --git a/src/prediction/item_string_converter.h b/src/prediction/item_string_converter.h new file mode 100644 index 0000000..15de8b2 --- /dev/null +++ b/src/prediction/item_string_converter.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_ITEM_STRING_CONVERTER_H_ +#define _PREDICTION_ITEM_STRING_CONVERTER_H_ + +#include "item.h" + +namespace ctx { + + class ItemStringConverter { + + public: + static const char SEPARATOR = ':'; + static std::string item_to_string(const Item &item); + static Item string_to_item(const std::string& s); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_ITEM_STRING_CONVERTER_H_ */ diff --git a/src/prediction/single_category_item_id_filter.cpp b/src/prediction/single_category_item_id_filter.cpp new file mode 100644 index 0000000..6646e8d --- /dev/null +++ b/src/prediction/single_category_item_id_filter.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "single_category_item_id_filter.h" + +ctx::SingleCategoryItemIdFilter::SingleCategoryItemIdFilter(std::string category, const ctx::ItemCatalogue &itemCatalogue) +{ + mAcceptedItemIds = itemCatalogue.category_item_ids(category); +} + +bool ctx::SingleCategoryItemIdFilter::pass(int itemId) const +{ + return mAcceptedItemIds.find(itemId) != mAcceptedItemIds.end(); +} diff --git a/src/prediction/single_category_item_id_filter.h b/src/prediction/single_category_item_id_filter.h new file mode 100644 index 0000000..4cc7dd6 --- /dev/null +++ b/src/prediction/single_category_item_id_filter.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_SINGLE_CATEGORY_ITEM_ID_FILTER_H_ +#define _PREDICTION_SINGLE_CATEGORY_ITEM_ID_FILTER_H_ + +#include "i_item_id_filter.h" +#include "item_catalogue.h" + +namespace ctx { + + class SingleCategoryItemIdFilter : public IItemIdFilter { + + public: + SingleCategoryItemIdFilter(std::string category, const ItemCatalogue& itemCatalogue); + bool pass(int itemId) const override; + + private: + std::set mAcceptedItemIds; + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_SINGLE_CATEGORY_ITEM_ID_FILTER_H_ */ diff --git a/src/prediction/weight_apriori.cpp b/src/prediction/weight_apriori.cpp new file mode 100644 index 0000000..92aaebc --- /dev/null +++ b/src/prediction/weight_apriori.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "weight_apriori.h" +#include +#include + +std::list ctx::WeightApriori::find_wider_candidates(const std::list &narrowFreqSets, int widerSize) +{ + std::list candidates; + for (auto iter1 = narrowFreqSets.begin(); iter1 != narrowFreqSets.end(); ++iter1) { + auto iter2 = iter1; ++iter2; + for (;iter2 != narrowFreqSets.end(); ++iter2) { + ItemIdSet itemIdSet1 = *iter1; + ItemIdSet itemIdSet2 = *iter2; + itemIdSet1.merge(itemIdSet2); + itemIdSet1.unique(); + if (int(itemIdSet1.size()) == widerSize) { + candidates.push_back(itemIdSet1); + } + } + } + candidates.sort(); + candidates.unique(); + return candidates; +} + +void ctx::WeightApriori::prune_wider_candidates(std::list& widerCandidates, const std::list& narrowFreqSets) +{ + std::list pruned; + for (auto iter = widerCandidates.begin(); iter != widerCandidates.end();) { + if (survives_prunning(*iter, narrowFreqSets)) { + ++iter; + } else { + iter = widerCandidates.erase(iter); + } + } +} + +bool ctx::WeightApriori::survives_prunning(ctx::ItemIdSet& widerCandidate, const std::list& narrowFreqSets) +{ + int removedItemId = widerCandidate.front(); + widerCandidate.pop_front(); + for (auto iter = widerCandidate.begin();; ++iter) { + if (std::find(narrowFreqSets.begin(), narrowFreqSets.end(), widerCandidate) == narrowFreqSets.end()) { + return false; // Caution: In this case the original contents of widerCandidate is not preserved. + } + if (iter == widerCandidate.end()) { + widerCandidate.push_back(removedItemId); // Restoring original contents of widerCandidate. + return true; + } + int newRemovedItemId = *iter; + *iter = removedItemId; + removedItemId = newRemovedItemId; + } +} + +std::list> ctx::WeightApriori::find_frequent_itemid_sets(ctx::BasketsAgregator &basketAgregator, double supportThreshold) +{ + std::list> allFreqItemsets; + std::list freqItemsetsOfCurrSize; + std::list candidates; + + int candidateSize = 1; + candidates = single_size_candidates(basketAgregator); + + while (!candidates.empty()) { + for (ItemIdSet candidate : candidates) { + double support = basketAgregator.supportOf(candidate); + if (support >= supportThreshold) { + freqItemsetsOfCurrSize.push_back(candidate); + allFreqItemsets.push_back(std::make_pair(candidate,support)); + } + } + candidates = find_wider_candidates(freqItemsetsOfCurrSize, ++candidateSize); + freqItemsetsOfCurrSize.clear(); + } + return allFreqItemsets; +} + +std::list ctx::WeightApriori::single_size_candidates(ctx::BasketsAgregator& basketAgregator) +{ + std::list candidates; + for (int itemId : basketAgregator.unique_item_ids()) { + candidates.push_back({itemId}); + } + return candidates; +} diff --git a/src/prediction/weight_apriori.h b/src/prediction/weight_apriori.h new file mode 100644 index 0000000..6cb493d --- /dev/null +++ b/src/prediction/weight_apriori.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 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 _PREDICTION_WEIGHT_APRIORI_H_ +#define _PREDICTION_WEIGHT_APRIORI_H_ + +#include "baskets_agregator.h" +#include +#include + +namespace ctx { + + class WeightApriori { + + public: + static std::list find_wider_candidates(const std::list &narrowFreqSets, int widerSize); + static void prune_wider_candidates(std::list &widerCandidates, const std::list &narrowFreqSets); + + static bool survives_prunning(ItemIdSet &widerCandidate, const std::list &narrowFreqSets); + + /* Find frequent itemsets along with its support value. */ + static std::list> find_frequent_itemid_sets(BasketsAgregator &basketAgregator, double supportThreshold); + + private: + static std::list single_size_candidates(BasketsAgregator &basketAgregator); + + }; + +} /* namespace ctx */ + +#endif /* _PREDICTION_WEIGHT_APRIORI_H_ */ diff --git a/src/shared/CommonTypes.h b/src/shared/CommonTypes.h new file mode 100644 index 0000000..d6673e1 --- /dev/null +++ b/src/shared/CommonTypes.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_COMMON_TYPES_H_ +#define _CONTEXT_STATS_COMMON_TYPES_H_ + +#define LOG_RETENTION_PERIOD 7776000 /* 90 days in secs */ + +#define DEFAULT_TIMESPAN 30 +#define DEFAULT_LIMIT 10 + +#define STATS_QUERY_RESULT "QueryResult" +#define STATS_RESULT_SIZE "ResultSize" +#define STATS_COL_ROW_ID "rowId" + +#define STATS_TIMESPAN "TimeSpan" +#define STATS_START_TIME "StartTime" +#define STATS_END_TIME "EndTime" +#define STATS_LAST_TIME "LastTime" +#define STATS_TOTAL_COUNT "TotalCount" +#define STATS_AVERAGE_COUNT "AvgCount" +#define STATS_DURATION "Duration" +#define STATS_TOTAL_DURATION "TotalDuration" +#define STATS_DAY_OF_WEEK "DayOfWeek" +#define STATS_HOUR_OF_DAY "HourOfDay" +#define STATS_TIME_OF_DAY "TimeOfDay" +#define STATS_TOTAL_COUNT "TotalCount" +#define STATS_APP_ID "AppId" +#define STATS_PKG_ID "PkgId" +#define STATS_AUDIO_JACK "AudioJack" +#define STATS_SYSTEM_VOLUME "SystemVolume" +#define STATS_MEDIA_VOLUME "MediaVolume" +#define STATS_BSSID "BSSID" +#define STATS_UNIV_TIME "UTC" +#define STATS_LOCAL_TIME "LocalTime" +#define STATS_RANK "Rank" + +#define STATS_SUN "Sun" +#define STATS_MON "Mon" +#define STATS_TUE "Tue" +#define STATS_WED "Wed" +#define STATS_THU "Thu" +#define STATS_FRI "Fri" +#define STATS_SAT "Sat" +#define STATS_WEEKDAY "Weekday" +#define STATS_WEEKEND "Weekend" + +enum StatsDayOfWeek_e { + STATS_DAY_OF_WEEK_WEEKDAY = 1, + STATS_DAY_OF_WEEK_WEEKEND, + STATS_DAY_OF_WEEK_ALL, + STATS_DAY_OF_WEEK_SUN, + STATS_DAY_OF_WEEK_MON, + STATS_DAY_OF_WEEK_TUE, + STATS_DAY_OF_WEEK_WED, + STATS_DAY_OF_WEEK_THU, + STATS_DAY_OF_WEEK_FRI, + STATS_DAY_OF_WEEK_SAT, +}; + +#define TRIG_DEF_RANK "\"Rank\":{\"type\":\"integer\",\"min\":1}" +#define TRIG_DEF_TOTAL_COUNT "\"TotalCount\":{\"type\":\"integer\",\"min\":0}" +#define TRIG_DEF_TIME_OF_DAY "\"TimeOfDay\":{\"type\":\"string\"}" +#define TRIG_DEF_DAY_OF_WEEK "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}" + +#endif /* End of _CONTEXT_STATS_COMMMON_TYPES_ */ diff --git a/src/shared/DbHandleBase.cpp b/src/shared/DbHandleBase.cpp new file mode 100644 index 0000000..979f75b --- /dev/null +++ b/src/shared/DbHandleBase.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include "CommonTypes.h" +#include "DbHandleBase.h" + +#define DAY_OF_WEEK(SECOND) "CAST(strftime('%w', " SECOND ", 'unixepoch') AS INTEGER)" +#define HOUR_OF_DAY(SECOND) "CAST(strftime('%H', " SECOND ", 'unixepoch') AS INTEGER)" + +using namespace ctx; + +StatsDbHandleBase::StatsDbHandleBase(ContextProvider *provider) : + isTriggerItem(false), + reqProvider(provider) +{ +} + +StatsDbHandleBase::~StatsDbHandleBase() +{ +} + +int StatsDbHandleBase::generateQid() +{ + static int qid = 0; + + if (qid++ < 0) qid = 1; + return qid; +} + +bool StatsDbHandleBase::executeQuery(Json filter, const char* query) +{ + bool ret = __dbManager.execute(generateQid(), query, this); + IF_FAIL_RETURN(ret, false); + + reqFilter = filter; + + return true; +} + +std::string StatsDbHandleBase::createWhereClause(Json filter) +{ + std::stringstream whereClause; + int week = 0; + int start = 0; + int end = 0; + int timespan = DEFAULT_TIMESPAN; + std::string appId; + std::string weekStr; + std::string timeOfDay; + + if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) { + // In case of string (from Trigger) + if (weekStr == STATS_WEEKDAY) { + week = STATS_DAY_OF_WEEK_WEEKDAY; + + } else if (weekStr == STATS_WEEKEND) { + week = STATS_DAY_OF_WEEK_WEEKEND; + + } else if (weekStr == STATS_SUN) { + week = STATS_DAY_OF_WEEK_SUN; + + } else if (weekStr == STATS_MON) { + week = STATS_DAY_OF_WEEK_MON; + + } else if (weekStr == STATS_TUE) { + week = STATS_DAY_OF_WEEK_TUE; + + } else if (weekStr == STATS_WED) { + week = STATS_DAY_OF_WEEK_WED; + + } else if (weekStr == STATS_THU) { + week = STATS_DAY_OF_WEEK_THU; + + } else if (weekStr == STATS_FRI) { + week = STATS_DAY_OF_WEEK_FRI; + + } else if (weekStr == STATS_SAT) { + week = STATS_DAY_OF_WEEK_SAT; + } + } else { + // In case of integer (from History) + filter.get(NULL, STATS_DAY_OF_WEEK, &week); + } + + switch(week) { + case STATS_DAY_OF_WEEK_WEEKDAY: + whereClause << "(" DAY_OF_WEEK(STATS_LOCAL_TIME) " > 0 AND " DAY_OF_WEEK(STATS_LOCAL_TIME) " < 6) AND "; + break; + case STATS_DAY_OF_WEEK_WEEKEND: + whereClause << "(" DAY_OF_WEEK(STATS_LOCAL_TIME) " = 0 OR " DAY_OF_WEEK(STATS_LOCAL_TIME) " = 6) AND "; + break; + case STATS_DAY_OF_WEEK_SUN: + case STATS_DAY_OF_WEEK_MON: + case STATS_DAY_OF_WEEK_TUE: + case STATS_DAY_OF_WEEK_WED: + case STATS_DAY_OF_WEEK_THU: + case STATS_DAY_OF_WEEK_FRI: + case STATS_DAY_OF_WEEK_SAT: + whereClause << DAY_OF_WEEK(STATS_LOCAL_TIME) " = " << week - STATS_DAY_OF_WEEK_SUN << " AND "; + break; + default: + break; + } + + if (filter.get(NULL, STATS_APP_ID, &appId)) + whereClause << STATS_APP_ID " = '" << appId << "' AND "; + + if (filter.get(NULL, STATS_START_TIME, &start)) + whereClause << STATS_UNIV_TIME " >= " << start << " AND "; + + if (filter.get(NULL, STATS_END_TIME, &end)) + whereClause << STATS_UNIV_TIME " <= " << end << " AND "; + + if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) { + size_t pivot = timeOfDay.find('-'); + if (pivot != std::string::npos) { + std::string from = timeOfDay.substr(0, pivot); + std::string to = timeOfDay.substr(pivot + 1); + whereClause << "(" HOUR_OF_DAY(STATS_LOCAL_TIME) " >= " << from \ + << " AND " HOUR_OF_DAY(STATS_LOCAL_TIME) " < " << to << ") AND "; + } + } + + filter.get(NULL, STATS_TIMESPAN, ×pan); + whereClause << STATS_UNIV_TIME " > strftime('%s', 'now', '-" << timespan <<" day')"; + + return whereClause.str(); +} + +std::string StatsDbHandleBase::createSqlPeakTime(Json filter, const char* tableName, std::string whereClause) +{ + std::stringstream query; + int limit = DEFAULT_LIMIT; + + filter.get(NULL, STATS_RESULT_SIZE, &limit); + + query << + "SELECT " \ + HOUR_OF_DAY(STATS_LOCAL_TIME) " AS " STATS_HOUR_OF_DAY ", COUNT(*) AS " STATS_TOTAL_COUNT \ + " FROM " << tableName << \ + " WHERE " << whereClause << \ + " GROUP BY " HOUR_OF_DAY(STATS_LOCAL_TIME) \ + " ORDER BY " STATS_TOTAL_COUNT " DESC" \ + " LIMIT " << limit; + + return query.str(); +} + +std::string StatsDbHandleBase::createSqlCommonSetting(Json filter, const char* tableName, std::string whereClause) +{ + std::stringstream query; + + query << + "SELECT ( SELECT " STATS_AUDIO_JACK \ + " FROM " << tableName << \ + " WHERE " << whereClause << \ + " GROUP BY " STATS_AUDIO_JACK \ + " ORDER BY count(" STATS_AUDIO_JACK ") DESC" \ + " LIMIT 1 ) AS " STATS_AUDIO_JACK \ + ", ( SELECT " STATS_SYSTEM_VOLUME \ + " FROM " << tableName << \ + " WHERE " << whereClause << \ + " GROUP BY " STATS_SYSTEM_VOLUME \ + " ORDER BY count(" STATS_SYSTEM_VOLUME ") DESC" \ + " LIMIT 1 ) AS " STATS_SYSTEM_VOLUME \ + ", ( SELECT " STATS_MEDIA_VOLUME \ + " FROM " << tableName << \ + " WHERE " << whereClause << \ + " GROUP BY " STATS_MEDIA_VOLUME \ + " ORDER BY count(" STATS_MEDIA_VOLUME ") DESC" \ + " LIMIT 1 ) AS " STATS_MEDIA_VOLUME; + + return query.str(); +} + +void StatsDbHandleBase::onTableCreated(unsigned int queryId, int error) +{ +} + +void StatsDbHandleBase::onInserted(unsigned int queryId, int error, int64_t rowId) +{ + delete this; +} + +void StatsDbHandleBase::__jsonVectorToArray(std::vector &vecJson, Json &jsonResult) +{ + std::vector::iterator vecJsonEnd = vecJson.end(); + + for(auto vecJsonPos = vecJson.begin(); vecJsonPos != vecJsonEnd; ++vecJsonPos) { + Json originJson = *vecJsonPos; + jsonResult.append(NULL, STATS_QUERY_RESULT, originJson); + } +} + +void StatsDbHandleBase::onExecuted(unsigned int queryId, int error, std::vector& records) +{ + if (isTriggerItem) { + if (records.size() == 1) { + replyTriggerItem(error, records[0]); + } else { + _E("Invalid query result"); + Json dummy; + reqProvider->replyToRead(reqFilter, ERR_OPERATION_FAILED, dummy); + } + } else { + Json results = "{\"" STATS_QUERY_RESULT "\":[]}"; + __jsonVectorToArray(records, results); + reqProvider->replyToRead(reqFilter, error, results); + } + + delete this; +} diff --git a/src/shared/DbHandleBase.h b/src/shared/DbHandleBase.h new file mode 100644 index 0000000..8949550 --- /dev/null +++ b/src/shared/DbHandleBase.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_DB_HANDLE_BASE_H_ +#define _CONTEXT_STATS_DB_HANDLE_BASE_H_ + +#include +#include +#include + +namespace ctx { + class StatsDbHandleBase : public IDatabaseListener { + protected: + bool isTriggerItem; + ContextProvider *reqProvider; + Json reqFilter; + + StatsDbHandleBase(ContextProvider *provider); + ~StatsDbHandleBase(); + + std::string createWhereClause(Json filter); + std::string createSqlPeakTime(Json filter, const char* tableName, std::string whereClause); + std::string createSqlCommonSetting(Json filter, const char* tableName, std::string whereClause); + + bool executeQuery(Json filter, const char* query); + virtual void replyTriggerItem(int error, Json &jsonResult) = 0; + static int generateQid(); + + private: + void __jsonVectorToArray(std::vector &vecJson, Json &jsonResult); + + void onTableCreated(unsigned int queryId, int error); + void onInserted(unsigned int queryId, int error, int64_t rowId); + void onExecuted(unsigned int queryId, int error, std::vector& records); + + DatabaseManager __dbManager; + }; +} + +#endif /* End of _CONTEXT_STATS_DB_HANDLE_BASE_H_ */ diff --git a/src/shared/DeviceContextProvider.cpp b/src/shared/DeviceContextProvider.cpp new file mode 100644 index 0000000..5ff533d --- /dev/null +++ b/src/shared/DeviceContextProvider.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include + +#include "../time/Alarm.h" +#include "../time/Time.h" +#include "../activity/Activity.h" +#include "../headphone/Headphone.h" +#include "../system/Battery.h" +#include "../system/Charger.h" +#include "../system/Gps.h" +#include "../system/Psmode.h" +#include "../system/Usb.h" +#include "../wifi/Wifi.h" + +#ifdef _MOBILE_ +#include "../call/Call.h" +#include "../contacts/Contacts.h" +#include "../email/Email.h" +#include "../message/Message.h" +#endif + +#define PRIV_NETWORK "network.get" +#define PRIV_TELEPHONY "telephony" +#define PRIV_MESSAGE "message.read" +#define PRIV_CONTACT "contact.read" + +template +void registerProvider(const char *subject, const char *privilege) +{ + Provider *provider = new(std::nothrow) Provider(); + IF_FAIL_VOID_TAG(provider, _E, "Memory allocation failed"); + + if (!provider->isSupported()) { + delete provider; + return; + } + + provider->registerProvider(privilege, provider); + provider->submitTriggerItem(); +} + +SO_EXPORT bool ctx::initDeviceContextProvider() +{ + registerProvider(DEVICE_ST_SUBJ_ALARM, NULL); + registerProvider(DEVICE_ST_SUBJ_TIME, NULL); + + registerProvider(DEVICE_ST_SUBJ_WIFI, PRIV_NETWORK); + registerProvider(DEVICE_ST_SUBJ_HEADPHONE, NULL); + + registerProvider(DEVICE_ST_SUBJ_CHARGER, NULL); + registerProvider(DEVICE_ST_SUBJ_GPS, NULL); + registerProvider(DEVICE_ST_SUBJ_USB, NULL); + registerProvider(DEVICE_ST_SUBJ_BATTERY, NULL); + registerProvider(DEVICE_ST_SUBJ_PSMODE, NULL); + + registerProvider(USER_ACT_SUBJ_STATIONARY, NULL); + registerProvider(USER_ACT_SUBJ_WALKING, NULL); + registerProvider(USER_ACT_SUBJ_RUNNING, NULL); + registerProvider(USER_ACT_SUBJ_IN_VEHICLE, NULL); + +#ifdef _MOBILE_ + registerProvider(SOCIAL_ST_SUBJ_CALL, PRIV_TELEPHONY); + registerProvider(SOCIAL_ST_SUBJ_EMAIL, NULL); + registerProvider(SOCIAL_ST_SUBJ_MESSAGE, PRIV_MESSAGE); + registerProvider(SOCIAL_ST_SUBJ_CONTACTS, PRIV_CONTACT); + + /* Create context providers, which need to be initiated before being subscribed */ + /* + if (DeviceStatusWifi::isSupported()) + DeviceStatusWifi::create(NULL); + */ +#endif + + return true; +} diff --git a/src/shared/DeviceProviderBase.cpp b/src/shared/DeviceProviderBase.cpp new file mode 100644 index 0000000..1c5f5ef --- /dev/null +++ b/src/shared/DeviceProviderBase.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "DeviceProviderBase.h" + +using namespace ctx; + +DeviceProviderBase::DeviceProviderBase(const char *subject) : + ContextProvider(subject), + __beingSubscribed(false) +{ +} + +bool DeviceProviderBase::isSupported() +{ + return true; +} + +void DeviceProviderBase::submitTriggerItem() +{ +} + +int DeviceProviderBase::subscribe(Json option, Json *requestResult) +{ + IF_FAIL_RETURN(!__beingSubscribed, ERR_NONE); + + int ret = subscribe(); + + if (ret == ERR_NONE) + __beingSubscribed = true; + + return ret; +} + +int DeviceProviderBase::unsubscribe(Json option) +{ + int ret = ERR_NONE; + + if (__beingSubscribed) + ret = unsubscribe(); + + return ret; +} + +int DeviceProviderBase::read(Json option, Json *requestResult) +{ + return read(); +} + +int DeviceProviderBase::write(Json data, Json *requestResult) +{ + return write(); +} + +int DeviceProviderBase::subscribe() +{ + return ERR_NOT_SUPPORTED; +} + +int DeviceProviderBase::unsubscribe() +{ + return ERR_NOT_SUPPORTED; +} + +int DeviceProviderBase::read() +{ + return ERR_NOT_SUPPORTED; +} + +int DeviceProviderBase::write() +{ + return ERR_NOT_SUPPORTED; +} + +bool DeviceProviderBase::getSystemInfoBool(const char *key) +{ + bool supported = false; + int ret = system_info_get_platform_bool(key, &supported); + IF_FAIL_RETURN_TAG(ret == SYSTEM_INFO_ERROR_NONE, false, _E, "system_info_get_platform_bool() failed"); + return supported; +} diff --git a/src/shared/DeviceProviderBase.h b/src/shared/DeviceProviderBase.h new file mode 100644 index 0000000..f5a55da --- /dev/null +++ b/src/shared/DeviceProviderBase.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_DEVICE_PROVIDER_BASE_H_ +#define _CONTEXT_DEVICE_PROVIDER_BASE_H_ + +#include + +namespace ctx { + + class DeviceProviderBase : public ContextProvider { + public: + int subscribe(Json option, Json *requestResult); + int unsubscribe(Json option); + int read(Json option, Json *requestResult); + int write(Json data, Json *requestResult); + + virtual bool isSupported(); + virtual void submitTriggerItem(); + + protected: + bool __beingSubscribed; + + DeviceProviderBase(const char *subject); + virtual ~DeviceProviderBase() {} + + virtual int subscribe(); + virtual int unsubscribe(); + virtual int read(); + virtual int write(); + + static bool getSystemInfoBool(const char *key); + }; +} + +#endif // _CONTEXT_DEVICE_PROVIDER_BASE_H_ diff --git a/src/shared/PlaceContextProvider.cpp b/src/shared/PlaceContextProvider.cpp new file mode 100644 index 0000000..eba5ff0 --- /dev/null +++ b/src/shared/PlaceContextProvider.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include + +#ifdef _MOBILE_ +#include "../geofence/PlaceGeofenceProvider.h" +#include "../my-place/place_recognition.h" +#endif /* _MOBILE_ */ + +template +void registerProvider(const char *subject, const char *privilege) +{ + Provider *provider = new(std::nothrow) Provider(); + IF_FAIL_VOID_TAG(provider, _E, "Memory allocation failed"); + + if (!provider->isSupported()) { + delete provider; + return; + } + + provider->registerProvider(privilege, provider); + provider->submitTriggerItem(); +} + +SO_EXPORT bool ctx::initPlaceContextProvider() +{ +#ifdef _MOBILE_ + registerProvider(PLACE_SUBJ_GEOFENCE, PLACE_PRIV_GEOFENCE); + + /* + registerProvider(PLACE_SUBJ_RECOGNITION, PLACE_PRIV_RECOGNITION); + */ + +#endif /* _MOBILE_ */ + return true; +} diff --git a/src/shared/SocialTypes.h b/src/shared/SocialTypes.h new file mode 100644 index 0000000..82dccff --- /dev/null +++ b/src/shared/SocialTypes.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_SOCIAL_STATUS_TYPES_H_ +#define _CONTEXT_SOCIAL_STATUS_TYPES_H_ + +// Subject +#define SOCIAL_ST_SUBJ_CALL "social/call" +#define SOCIAL_ST_SUBJ_EMAIL "social/email" +#define SOCIAL_ST_SUBJ_MESSAGE "social/message" +#define SOCIAL_ST_SUBJ_CONTACTS "social/contacts" + +// Data Key +#define SOCIAL_ST_STATE "State" +#define SOCIAL_ST_EVENT "Event" +#define SOCIAL_ST_TYPE "Type" +#define SOCIAL_ST_MEDIUM "Medium" +#define SOCIAL_ST_ADDRESS "Address" + +// Data Values +#define SOCIAL_ST_IDLE "Idle" +#define SOCIAL_ST_CONNECTING "Connecting" +#define SOCIAL_ST_CONNECTED "Connected" +#define SOCIAL_ST_ACTIVE SOCIAL_ST_CONNECTED +#define SOCIAL_ST_HELD "Held" +#define SOCIAL_ST_DIALING "Dialing" +#define SOCIAL_ST_ALERTING SOCIAL_ST_CONNECTING +#define SOCIAL_ST_INCOMING SOCIAL_ST_CONNECTING +#define SOCIAL_ST_VOICE "Voice" +#define SOCIAL_ST_VIDEO "Video" +#define SOCIAL_ST_SENT "Sent" +#define SOCIAL_ST_RECEIVED "Received" +#define SOCIAL_ST_SMS "SMS" +#define SOCIAL_ST_MMS "MMS" +#define SOCIAL_ST_MY_PROFILE "MyProfile" +#define SOCIAL_ST_PERSON "Person" +#define SOCIAL_ST_CHANGED "Changed" + +#endif //_CONTEXT_SOCIAL_STATUS_TYPES_H diff --git a/src/shared/StatisticsContextProvider.cpp b/src/shared/StatisticsContextProvider.cpp new file mode 100644 index 0000000..cfaf008 --- /dev/null +++ b/src/shared/StatisticsContextProvider.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include + +#include "../app-stats/AppStatsProvider.h" +#include "../app-stats/AppStatsLogger.h" + +#ifdef _MOBILE_ +#include "../media-stats/MediaStatsProvider.h" +#include "../media-stats/MediaStatsLogger.h" +#include "../social-stats/SocialStatsProvider.h" +#include "../social-stats/SocialStatsLogger.h" +#endif + +template +void registerProvider(const char *subject, const char *privilege) +{ + Provider *provider = new(std::nothrow) Provider(); + IF_FAIL_VOID_TAG(provider, _E, "Memory allocation failed"); + + if (!provider->isSupported()) { + delete provider; + return; + } + + provider->registerProvider(privilege, provider); + provider->submitTriggerItem(); +} + +SO_EXPORT bool ctx::initStatisticsContextProvider() +{ + registerProvider(APP_SUBJ_LOGGER, APP_HISTORY_PRIV); + registerProvider(APP_SUBJ_RECENTLY_USED, APP_HISTORY_PRIV); + registerProvider(APP_SUBJ_FREQUENTLY_USED, APP_HISTORY_PRIV); + registerProvider(APP_SUBJ_RARELY_USED, APP_HISTORY_PRIV); + registerProvider(APP_SUBJ_PEAK_TIME, APP_HISTORY_PRIV); + registerProvider(APP_SUBJ_COMMON_SETTING, APP_HISTORY_PRIV); + registerProvider(APP_SUBJ_FREQUENCY, APP_HISTORY_PRIV); + +#ifdef _MOBILE_ + registerProvider(MEDIA_SUBJ_LOGGER, MEDIA_HISTORY_PRIV); + registerProvider(MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC, MEDIA_HISTORY_PRIV); + registerProvider(MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO, MEDIA_HISTORY_PRIV); + registerProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC, MEDIA_HISTORY_PRIV); + registerProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO, MEDIA_HISTORY_PRIV); + registerProvider(MEDIA_SUBJ_MUSIC_FREQUENCY, MEDIA_HISTORY_PRIV); + registerProvider(MEDIA_SUBJ_VIDEO_FREQUENCY, MEDIA_HISTORY_PRIV); + + registerProvider(SOCIAL_SUBJ_LOGGER, SOCIAL_HISTORY_PRIV); + registerProvider(SOCIAL_SUBJ_FREQUENCY, SOCIAL_HISTORY_PRIV); + registerProvider(SOCIAL_SUBJ_FREQ_ADDRESS, SOCIAL_HISTORY_PRIV); +#endif + + return true; +} diff --git a/src/shared/SystemInfo.cpp b/src/shared/SystemInfo.cpp new file mode 100644 index 0000000..63731f7 --- /dev/null +++ b/src/shared/SystemInfo.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include +#include +#include "SystemInfo.h" + +#define CONNECTED 1 +#define NOT_CONNECTED 0 + +using namespace ctx; + +bool system_info::getAudioJackState(int* state) +{ + int value = NOT_CONNECTED; + int err = runtime_info_get_value_int(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, &value); + IF_FAIL_RETURN(err == RUNTIME_INFO_ERROR_NONE, false); + + *state = (value == NOT_CONNECTED ? NOT_CONNECTED : CONNECTED); + + return true; +} + +bool system_info::getVolume(int* systemVolume, int* mediaVolume) +{ + int err; + + err = sound_manager_get_volume(SOUND_TYPE_SYSTEM, systemVolume); + IF_FAIL_RETURN(err == RUNTIME_INFO_ERROR_NONE, false); + + err = sound_manager_get_volume(SOUND_TYPE_MEDIA, mediaVolume); + IF_FAIL_RETURN(err == RUNTIME_INFO_ERROR_NONE, false); + + return true; +} + +bool system_info::getWifiBssid(std::string& bssid) +{ +#if 0 + /* NOTE: This routine does not work, because the wifi API does not support multi-sessions in one process */ + int err; + char *strBuf = NULL; + wifi_ap_h ap = NULL; + + err = wifi_initialize(); + IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _W, "wifi_initialize() failed (%d)", err); + + err = wifi_get_connected_ap(&ap); + if (err != WIFI_ERROR_NONE) { + _D("wifi_get_connected_ap() failed (%d)", err); + wifi_deinitialize(); + return false; + } + + wifi_ap_get_bssid(ap, &strBuf); + bssid = (strBuf != NULL ? strBuf : ""); + g_free(strBuf); + + wifi_ap_destroy(ap); + wifi_deinitialize(); + + return !bssid.empty(); +#endif + bssid = SharedVars().get(SharedVars::WIFI_BSSID); + return true; +} diff --git a/src/shared/SystemInfo.h b/src/shared/SystemInfo.h new file mode 100644 index 0000000..86f5b19 --- /dev/null +++ b/src/shared/SystemInfo.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_SYSTEM_INFO_READER_H_ +#define _CONTEXT_STATS_SYSTEM_INFO_READER_H_ + +#include + +namespace ctx { + namespace system_info { + bool getAudioJackState(int* state); + bool getVolume(int* systemVolume, int* mediaVolume); + bool getWifiBssid(std::string& bssid); + } +} + +#endif /* End of _CONTEXT_STATS_SYSTEM_INFO_READER_H_ */ diff --git a/src/shared/SystemTypes.h b/src/shared/SystemTypes.h new file mode 100644 index 0000000..3129a36 --- /dev/null +++ b/src/shared/SystemTypes.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_TYPES_H_ +#define _DEVICE_SYSTEM_STATUS_TYPES_H_ + +// Subject +#define DEVICE_ST_SUBJ_BATTERY "system/battery" +#define DEVICE_ST_SUBJ_CHARGER "system/charger" +#define DEVICE_ST_SUBJ_HEADPHONE "system/headphone" +#define DEVICE_ST_SUBJ_WIFI "system/wifi" +#define DEVICE_ST_SUBJ_USB "system/usb" +#define DEVICE_ST_SUBJ_GPS "system/gps" +#define DEVICE_ST_SUBJ_PSMODE "system/psmode" +#define DEVICE_ST_SUBJ_ALARM "device/alarm" +#define DEVICE_ST_SUBJ_TIME "device/time" + +// Data Key +#define DEVICE_ST_EVENT "Event" +#define DEVICE_ST_STATE "State" +#define DEVICE_ST_TYPE "Type" +#define DEVICE_ST_LEVEL "Level" +#define DEVICE_ST_BSSID "BSSID" +#define DEVICE_ST_IS_CONNECTED "IsConnected" +#define DEVICE_ST_IS_ENABLED "IsEnabled" +#define DEVICE_ST_IS_CHARGING "IsCharging" +#define DEVICE_ST_DETECTED "Detected" +#define DEVICE_ST_TIME_OF_DAY "TimeOfDay" +#define DEVICE_ST_DAY_OF_WEEK "DayOfWeek" +#define DEVICE_ST_DAY_OF_MONTH "DayOfMonth" + +// Data Value +#define DEVICE_ST_TRUE 1 +#define DEVICE_ST_FALSE 0 +#define DEVICE_ST_ENTER "Enter" +#define DEVICE_ST_EXIT "Exit" +#define DEVICE_ST_DISABLED "Disabled" +#define DEVICE_ST_CONNECTED "Connected" +#define DEVICE_ST_UNCONNECTED "Unconnected" +#define DEVICE_ST_SEARCHING "Searching" +#define DEVICE_ST_EMPTY "Empty" +#define DEVICE_ST_CRITICAL "Critical" +#define DEVICE_ST_LOW "Low" +#define DEVICE_ST_NORMAL "Normal" +#define DEVICE_ST_HIGH "High" +#define DEVICE_ST_FULL "Full" +#define DEVICE_ST_HEADSET "Headset" +#define DEVICE_ST_BLUETOOTH "Bluetooth" + +#define TRIG_BOOL_ITEM_DEF(sbj) "\"" sbj "\":{\"type\":\"integer\",\"min\":0,\"max\":1}" + +#endif //_DEVICE_SYSTEM_STATUS_TYPES_H_ diff --git a/src/social-stats/DbHandle.cpp b/src/social-stats/DbHandle.cpp new file mode 100644 index 0000000..5c1c0a6 --- /dev/null +++ b/src/social-stats/DbHandle.cpp @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "SocialStatisticsTypes.h" +#include "DbHandle.h" + +using namespace ctx; + +SocialDbHandle::SocialDbHandle(ContextProvider *provider) : + StatsDbHandleBase(provider) +{ +} + +SocialDbHandle::~SocialDbHandle() +{ +} + +int SocialDbHandle::read(Json filter) +{ + std::string query; + const char *subject = reqProvider->getSubject(); + + if (STR_EQ(subject, SOCIAL_SUBJ_FREQ_ADDRESS)) { + query = createSqlFreqAddress(filter); + + } else if (STR_EQ(subject, SOCIAL_SUBJ_FREQUENCY)) { + isTriggerItem = true; + query = createSqlFrequency(filter); + } + + IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); + + bool ret = executeQuery(filter, query.c_str()); + IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); + + return ERR_NONE; +} + +std::string SocialDbHandle::createWhereClause(Json filter) +{ + std::stringstream whereClause; + int commType = -1; + + whereClause << StatsDbHandleBase::createWhereClause(filter); + + filter.get(NULL, SOCIAL_COMMUNICATION_TYPE, &commType); + + switch(commType) { + case SOCIAL_COMMUNICATION_TYPE_CALL: + whereClause << + " AND " SOCIAL_PHONE_LOG_TYPE " >= " << CONTACTS_PLOG_TYPE_VOICE_INCOMING << + " AND " SOCIAL_PHONE_LOG_TYPE " <= " << CONTACTS_PLOG_TYPE_VIDEO_BLOCKED; + break; + case SOCIAL_COMMUNICATION_TYPE_MESSAGE: + whereClause << + " AND " SOCIAL_PHONE_LOG_TYPE " >= " << CONTACTS_PLOG_TYPE_MMS_INCOMING << + " AND " SOCIAL_PHONE_LOG_TYPE " <= " << CONTACTS_PLOG_TYPE_MMS_BLOCKED; + break; + default: + break; + } + + return whereClause.str(); +} + +std::string SocialDbHandle::createSqlFreqAddress(Json filter) +{ + std::stringstream query; + int limit = DEFAULT_LIMIT; + + filter.get(NULL, STATS_RESULT_SIZE, &limit); + + query << + "SELECT " SOCIAL_ADDRESS ", " \ + "COUNT(*) AS " STATS_TOTAL_COUNT ", " \ + "SUM(" STATS_DURATION ") AS " STATS_TOTAL_DURATION ", " \ + "MAX(" STATS_UNIV_TIME ") AS " STATS_LAST_TIME \ + " FROM " SOCIAL_TABLE_CONTACT_LOG \ + " WHERE " << createWhereClause(filter) << + " GROUP BY " SOCIAL_ADDRESS \ + " ORDER BY COUNT(*) DESC" \ + " LIMIT " << limit; + + return query.str(); +} + +std::string SocialDbHandle::createSqlFrequency(Json filter) +{ + Json filterCleaned; + std::string weekStr; + std::string timeOfDay; + std::string address; + + if (!filter.get(NULL, SOCIAL_ADDRESS, &address)) { + _E("Invalid parameter"); + return ""; + } + + if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) + filterCleaned.set(NULL, STATS_DAY_OF_WEEK, weekStr); + + if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) + filterCleaned.set(NULL, STATS_TIME_OF_DAY, timeOfDay); + + std::stringstream query; + + query << + "DELETE FROM " SOCIAL_TEMP_CONTACT_FREQ ";"; + + query << + "INSERT INTO " SOCIAL_TEMP_CONTACT_FREQ \ + " SELECT " SOCIAL_ADDRESS ", COUNT(*) AS " STATS_TOTAL_COUNT \ + " FROM " SOCIAL_TABLE_CONTACT_LOG \ + " WHERE " << createWhereClause(filterCleaned) << + " GROUP BY " SOCIAL_ADDRESS ";"; + + query << + "INSERT OR IGNORE INTO " SOCIAL_TEMP_CONTACT_FREQ " (" SOCIAL_ADDRESS ")" \ + " VALUES ('" << address << "');"; + + query << + "SELECT S." SOCIAL_ADDRESS ", S." STATS_TOTAL_COUNT ", 1+COUNT(lesser." STATS_TOTAL_COUNT ") AS " STATS_RANK \ + " FROM " SOCIAL_TEMP_CONTACT_FREQ " AS S" \ + " LEFT JOIN " SOCIAL_TEMP_CONTACT_FREQ " AS lesser" \ + " ON S." STATS_TOTAL_COUNT " < lesser." STATS_TOTAL_COUNT \ + " WHERE S." SOCIAL_ADDRESS " = '" << address << "'"; + + + return query.str(); +} + +void SocialDbHandle::replyTriggerItem(int error, Json &jsonResult) +{ + IF_FAIL_VOID_TAG(STR_EQ(reqProvider->getSubject(), SOCIAL_SUBJ_FREQUENCY), _E, "Invalid subject"); + + Json results; + std::string valStr; + int val; + + jsonResult.get(NULL, SOCIAL_ADDRESS, &valStr); + results.set(NULL, SOCIAL_ADDRESS, valStr); + jsonResult.get(NULL, STATS_TOTAL_COUNT, &val); + results.set(NULL, STATS_TOTAL_COUNT, val); + jsonResult.get(NULL, STATS_RANK, &val); + results.set(NULL, STATS_RANK, val); + + reqProvider->replyToRead(reqFilter, error, results); +} diff --git a/src/social-stats/DbHandle.h b/src/social-stats/DbHandle.h new file mode 100644 index 0000000..576c6a1 --- /dev/null +++ b/src/social-stats/DbHandle.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_SOCIAL_DB_HANDLE_H_ +#define _CONTEXT_STATS_SOCIAL_DB_HANDLE_H_ + +#include +#include +#include "../shared/DbHandleBase.h" + +namespace ctx { + class SocialDbHandle : public StatsDbHandleBase { + public: + SocialDbHandle(ContextProvider *provider); + ~SocialDbHandle(); + + int read(Json filter); + + protected: + std::string createWhereClause(Json filter); + std::string createSqlFreqAddress(Json filter); + std::string createSqlFrequency(Json filter); + void replyTriggerItem(int error, Json &jsonResult); + }; +} + +#endif /* End of _CONTEXT_STATS_SOCIAL_DB_HANDLE_H_ */ diff --git a/src/social-stats/LogAggregator.cpp b/src/social-stats/LogAggregator.cpp new file mode 100644 index 0000000..dac092d --- /dev/null +++ b/src/social-stats/LogAggregator.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include +#include +#include "SocialStatisticsTypes.h" +#include "LogAggregator.h" + +ctx::ContactLogAggregator::ContactLogAggregator() : + __timerId(-1), + __timeDiff(0) +{ + __createTable(); + __timerId = __timerManager.setAt(3, 0, DayOfWeek::EVERYDAY, this); +} + +ctx::ContactLogAggregator::~ContactLogAggregator() +{ + __timerManager.remove(__timerId); +} + +void ctx::ContactLogAggregator::__createTable() +{ + static bool done = false; + IF_FAIL_VOID(!done); + + __dbManager.createTable(0, SOCIAL_TABLE_CONTACT_LOG, SOCIAL_TABLE_CONTACT_LOG_COLUMNS, NULL, NULL); + __dbManager.execute(0, SOCIAL_TEMP_CONTACT_FREQ_SQL, NULL); + + done = true; +} + +bool ctx::ContactLogAggregator::onTimerExpired(int timerId) +{ + aggregateContactLog(); + return true; +} + +void ctx::ContactLogAggregator::aggregateContactLog() +{ + __dbManager.execute(0, + "SELECT IFNULL(MAX(" STATS_UNIV_TIME "),0) AS " STATS_LAST_TIME \ + ", (strftime('%s', 'now', 'localtime')) - (strftime('%s', 'now')) AS " TIME_DIFFERENCE \ + " FROM " SOCIAL_TABLE_CONTACT_LOG, this); +} + +void ctx::ContactLogAggregator::onExecuted(unsigned int queryId, int error, std::vector& records) +{ + IF_FAIL_VOID_TAG(!records.empty(), _E, "Invalid query result"); + + int lastTime = 0; + records[0].get(NULL, STATS_LAST_TIME, &lastTime); + records[0].get(NULL, TIME_DIFFERENCE, &__timeDiff); + + _D("Last Time: %d / Local - UTC: %d", lastTime, __timeDiff); + + contacts_list_h list = NULL; + + __getUpdatedContactLogList(lastTime, &list); + IF_FAIL_VOID(list); + + __removeExpiredLog(); + __insertContactLogList(list); + __destroyContactLogList(list); +} + +void ctx::ContactLogAggregator::__getUpdatedContactLogList(int lastTime, contacts_list_h *list) +{ + contacts_filter_h filter = NULL; + contacts_query_h query = NULL; + + int err = contacts_connect(); + IF_FAIL_VOID_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_connect() failed"); + + err = contacts_filter_create(_contacts_phone_log._uri, &filter); + IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_filter_create() failed"); + + contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_VOICE_INCOMING); + contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); + contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_LESS_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_MMS_BLOCKED); + contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); + contacts_filter_add_int(filter, _contacts_phone_log.log_time , CONTACTS_MATCH_GREATER_THAN, lastTime); + contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); + + err = contacts_query_create(_contacts_phone_log._uri, &query); + IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_query_create() failed"); + + contacts_query_set_filter(query, filter); + contacts_query_set_sort(query, _contacts_phone_log.log_time, true); + + err = contacts_db_get_records_with_query(query, 0, 0, list); + IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_db_get_records_with_query() failed"); + +CATCH: + if (filter) + contacts_filter_destroy(filter); + if (query) + contacts_query_destroy(query); +} + +void ctx::ContactLogAggregator::__destroyContactLogList(contacts_list_h list) +{ + if (list) + contacts_list_destroy(list, true); + + contacts_disconnect(); +} + +void ctx::ContactLogAggregator::__insertContactLogList(contacts_list_h list) +{ + IF_FAIL_VOID(contacts_list_first(list) == CONTACTS_ERROR_NONE); + + do { + contacts_record_h record = NULL; + contacts_list_get_current_record_p(list, &record); + if (record == NULL) break; + + ctx::Json data; + + char* address = NULL; + int logType; + int duration = 0; + int accessTime = 0; + + contacts_record_get_str_p(record, _contacts_phone_log.address, &address); + + if (!address) { + _W("Getting address failed"); + continue; + } + + contacts_record_get_int(record, _contacts_phone_log.log_type, &logType); + contacts_record_get_int(record, _contacts_phone_log.extra_data1, &duration); + contacts_record_get_int(record, _contacts_phone_log.log_time, &accessTime); + + data.set(NULL, SOCIAL_ADDRESS, address); + data.set(NULL, SOCIAL_PHONE_LOG_TYPE, logType); + data.set(NULL, STATS_DURATION, duration); + data.set(NULL, STATS_UNIV_TIME, accessTime); + data.set(NULL, STATS_LOCAL_TIME, accessTime + __timeDiff); + + __dbManager.insert(0, SOCIAL_TABLE_CONTACT_LOG, data, NULL); + + } while(contacts_list_next(list) == CONTACTS_ERROR_NONE); +} + +void ctx::ContactLogAggregator::__removeExpiredLog() +{ + std::stringstream query; + query << "DELETE FROM " SOCIAL_TABLE_CONTACT_LOG " WHERE " \ + STATS_UNIV_TIME " < strftime('%s', 'now') - " << LOG_RETENTION_PERIOD; + __dbManager.execute(0, query.str().c_str(), NULL); +} diff --git a/src/social-stats/LogAggregator.h b/src/social-stats/LogAggregator.h new file mode 100644 index 0000000..cc3962d --- /dev/null +++ b/src/social-stats/LogAggregator.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_SOCIAL_CONTACT_LOG_AGGREGATOR_H_ +#define _CONTEXT_STATS_SOCIAL_CONTACT_LOG_AGGREGATOR_H_ + +#include +#include +#include + +namespace ctx { + + class ContactLogAggregator : public IDatabaseListener, public ITimerListener { + private: + int __timerId; + int __timeDiff; + TimerManager __timerManager; + DatabaseManager __dbManager; + + void __createTable(); + void __getUpdatedContactLogList(int last_time, contacts_list_h *list); + void __insertContactLogList(contacts_list_h list); + void __destroyContactLogList(contacts_list_h list); + void __removeExpiredLog(); + + public: + ContactLogAggregator(); + ~ContactLogAggregator(); + + void aggregateContactLog(); + + void onTableCreated(unsigned int queryId, int error) {} + void onInserted(unsigned int queryId, int error, int64_t rowId) {} + void onExecuted(unsigned int queryId, int error, std::vector& records); + bool onTimerExpired(int timerId); + + }; /* class ContactLogAggregator */ + +} /* namespace ctx */ + +#endif /* End of _CONTEXT_STATS_SOCIAL_CONTACT_LOG_AGGREGTOR_H_ */ diff --git a/src/social-stats/SocialStatisticsTypes.h b/src/social-stats/SocialStatisticsTypes.h new file mode 100644 index 0000000..7c68b93 --- /dev/null +++ b/src/social-stats/SocialStatisticsTypes.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 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 _CONTEXT_STATS_SOCIAL_TYPES_H_ +#define _CONTEXT_STATS_SOCIAL_TYPES_H_ + +#include "../shared/CommonTypes.h" + +#define SOCIAL_HISTORY_PRIV "callhistory.read" +#define SOCIAL_SUBJ_LOGGER "stats/contact/logger" +#define SOCIAL_SUBJ_FREQ_ADDRESS "stats/contact/often" +#define SOCIAL_SUBJ_FREQUENCY "stats/contact/frequency" + +#define SOCIAL_TABLE_CONTACT_LOG "Log_Contact" +#define SOCIAL_TABLE_CONTACT_LOG_COLUMNS \ + "Address TEXT NOT NULL, PLogType INTEGER NOT NULL, " \ + "Duration INTEGER NOT NULL DEFAULT 0, " \ + "UTC TIMESTAMP DEFAULT (strftime('%s', 'now')), " \ + "LocalTime TIMESTAMP DEFAULT (strftime('%s', 'now', 'localtime'))" + +#define SOCIAL_TEMP_CONTACT_FREQ "Temp_ContactFreq" +#define SOCIAL_TEMP_CONTACT_FREQ_SQL \ + "CREATE TABLE IF NOT EXISTS " SOCIAL_TEMP_CONTACT_FREQ \ + " (Address TEXT NOT NULL UNIQUE, TotalCount INTEGER DEFAULT 0);" + +#define SOCIAL_COMMUNICATION_TYPE "CommunicationType" +#define SOCIAL_ADDRESS "Address" +#define SOCIAL_PHONE_LOG_TYPE "PLogType" +#define TIME_DIFFERENCE "TimeDIff" + +enum SocialCommType { + SOCIAL_COMMUNICATION_TYPE_CALL = 1, + SOCIAL_COMMUNICATION_TYPE_MESSAGE, + SOCIAL_COMMUNICATION_TYPE_ALL +}; + +#endif /* End of _CONTEXT_STATS_SOCIAL_TYPES_ */ diff --git a/src/social-stats/SocialStatsLogger.cpp b/src/social-stats/SocialStatsLogger.cpp new file mode 100644 index 0000000..a32fa80 --- /dev/null +++ b/src/social-stats/SocialStatsLogger.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "SocialStatisticsTypes.h" +#include "SocialStatsLogger.h" + +using namespace ctx; + +SocialStatsLogger::SocialStatsLogger() : + ContextProvider(SOCIAL_SUBJ_LOGGER) +{ +} + +SocialStatsLogger::~SocialStatsLogger() +{ +} + +int SocialStatsLogger::subscribe(Json option, Json* requestResult) +{ + return ERR_NONE; +} + +int SocialStatsLogger::unsubscribe(Json option) +{ + return ERR_NONE; +} diff --git a/src/social-stats/SocialStatsLogger.h b/src/social-stats/SocialStatsLogger.h new file mode 100644 index 0000000..17850e9 --- /dev/null +++ b/src/social-stats/SocialStatsLogger.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_SOCIAL_STATS_LOGGER_H_ +#define _CONTEXT_SOCIAL_STATS_LOGGER_H_ + +#include +#include "LogAggregator.h" + +namespace ctx { + + class SocialStatsLogger : public ContextProvider { + public: + SocialStatsLogger(); + ~SocialStatsLogger(); + + int subscribe(Json option, Json* requestResult); + int unsubscribe(Json option); + + void submitTriggerItem() {} + + private: + ContactLogAggregator __aggregator; + }; + +} /* namespace ctx */ + +#endif /* _CONTEXT_SOCIAL_STATS_LOGGER_H_ */ + diff --git a/src/social-stats/SocialStatsProvider.cpp b/src/social-stats/SocialStatsProvider.cpp new file mode 100644 index 0000000..0c0dd6d --- /dev/null +++ b/src/social-stats/SocialStatsProvider.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016 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. + */ + +#include "SocialStatsProvider.h" +#include "DbHandle.h" + +using namespace ctx; + +SocialStatsProvider::SocialStatsProvider(const char *subject) : + ContextProvider(subject) +{ +} + +SocialStatsProvider::~SocialStatsProvider() +{ +} + +bool SocialStatsProvider::isSupported() +{ + /* TODO */ + return true; +} + +void SocialStatsProvider::submitTriggerItem() +{ +} + +int SocialStatsProvider::read(Json option, Json* requestResult) +{ + SocialDbHandle *handle = new(std::nothrow) SocialDbHandle(this); + IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); + + int err = handle->read(option); + if (err != ERR_NONE) { + delete handle; + return err; + } + + return ERR_NONE; +} + +void ContactFreqProvider::submitTriggerItem() +{ + registerTriggerItem(OPS_READ, + "{" TRIG_DEF_RANK "," TRIG_DEF_TOTAL_COUNT "}", + "{" + "\"Address\":{\"type\":\"string\"}," + TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK + "}"); +} diff --git a/src/social-stats/SocialStatsProvider.h b/src/social-stats/SocialStatsProvider.h new file mode 100644 index 0000000..0ee94fd --- /dev/null +++ b/src/social-stats/SocialStatsProvider.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016 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 _CONTEXT_SOCIAL_STATS_PROVIDER_H_ +#define _CONTEXT_SOCIAL_STATS_PROVIDER_H_ + +#include +#include "SocialStatisticsTypes.h" + +namespace ctx { + + class SocialStatsProvider : public ContextProvider { + public: + int read(Json option, Json* requestResult); + + bool isSupported(); + virtual void submitTriggerItem(); + + protected: + SocialStatsProvider(const char *subject); + virtual ~SocialStatsProvider(); + }; + + + class ContactFreqProvider: public SocialStatsProvider { + public: + ContactFreqProvider() : + SocialStatsProvider(SOCIAL_SUBJ_FREQUENCY) {} + + void submitTriggerItem(); + }; + + + class TopContactsProvider: public SocialStatsProvider { + public: + TopContactsProvider() : + SocialStatsProvider(SOCIAL_SUBJ_FREQ_ADDRESS) {} + }; + +} /* namespace ctx */ + +#endif /* _CONTEXT_SOCIAL_STATS_PROVIDER_H_ */ diff --git a/src/statistics/CMakeLists.txt b/src/statistics/CMakeLists.txt deleted file mode 100644 index 6b35770..0000000 --- a/src/statistics/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -# prvd_cdef, prvd_deps, and prvd_srcs need to be set properly - -# Build flag for the prediction engine. -# Set this to "yes" to enable the engine. -SET(enable_prediction_engine "no") - -# Common Profile -FILE(GLOB prvd_srcs ./*.cpp) -FILE(GLOB prvd_srcs ${prvd_srcs} shared/*.cpp) -FILE(GLOB prvd_srcs ${prvd_srcs} app/*.cpp) -IF("${enable_prediction_engine}" STREQUAL "yes") - FILE(GLOB prvd_srcs ${prvd_srcs} prediction/*.cpp) -ELSE("${enable_prediction_engine}" STREQUAL "yes") - SET(prvd_cdef ${prvd_cdef} _DISABLE_PREDICTION_ENGINE_) -ENDIF("${enable_prediction_engine}" STREQUAL "yes") - -SET(prvd_deps capi-system-runtime-info pkgmgr pkgmgr-info capi-appfw-package-manager) -SET(prvd_deps ${prvd_deps} capi-appfw-application capi-appfw-app-manager) -SET(prvd_deps ${prvd_deps} capi-media-sound-manager) - -# Mobile Profile -IF("${PROFILE}" STREQUAL "mobile") - FILE(GLOB prvd_srcs ${prvd_srcs} media/*.cpp) - FILE(GLOB prvd_srcs ${prvd_srcs} social/*.cpp) - SET(prvd_deps ${prvd_deps} contacts-service2 capi-content-media-content) -ENDIF("${PROFILE}" STREQUAL "mobile") - -# Wearable Profile -#IF("${PROFILE}" STREQUAL "wearable") -#ENDIF("${PROFILE}" STREQUAL "wearable") diff --git a/src/statistics/StatisticsContextProvider.cpp b/src/statistics/StatisticsContextProvider.cpp deleted file mode 100644 index 0dba666..0000000 --- a/src/statistics/StatisticsContextProvider.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include - -#include "app/AppStatsProvider.h" -#include "app/AppStatsLogger.h" - -#ifndef _DISABLE_PREDICTION_ENGINE_ -// include prediction engine header files here -#endif - -#ifdef _MOBILE_ -#include "media/MediaStatsProvider.h" -#include "media/MediaStatsLogger.h" -#include "social/SocialStatsProvider.h" -#include "social/SocialStatsLogger.h" -#endif - -template -void registerProvider(const char *subject, const char *privilege) -{ - Provider *provider = new(std::nothrow) Provider(); - IF_FAIL_VOID_TAG(provider, _E, "Memory allocation failed"); - - if (!provider->isSupported()) { - delete provider; - return; - } - - provider->registerProvider(privilege, provider); - provider->submitTriggerItem(); -} - -SO_EXPORT bool ctx::initStatisticsContextProvider() -{ - registerProvider(APP_SUBJ_LOGGER, APP_HISTORY_PRIV); - registerProvider(APP_SUBJ_RECENTLY_USED, APP_HISTORY_PRIV); - registerProvider(APP_SUBJ_FREQUENTLY_USED, APP_HISTORY_PRIV); - registerProvider(APP_SUBJ_RARELY_USED, APP_HISTORY_PRIV); - registerProvider(APP_SUBJ_PEAK_TIME, APP_HISTORY_PRIV); - registerProvider(APP_SUBJ_COMMON_SETTING, APP_HISTORY_PRIV); - registerProvider(APP_SUBJ_FREQUENCY, APP_HISTORY_PRIV); - -#ifndef _DISABLE_PREDICTION_ENGINE_ -// initialize the prediction engine here -#endif - -#ifdef _MOBILE_ - registerProvider(MEDIA_SUBJ_LOGGER, MEDIA_HISTORY_PRIV); - registerProvider(MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC, MEDIA_HISTORY_PRIV); - registerProvider(MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO, MEDIA_HISTORY_PRIV); - registerProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC, MEDIA_HISTORY_PRIV); - registerProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO, MEDIA_HISTORY_PRIV); - registerProvider(MEDIA_SUBJ_MUSIC_FREQUENCY, MEDIA_HISTORY_PRIV); - registerProvider(MEDIA_SUBJ_VIDEO_FREQUENCY, MEDIA_HISTORY_PRIV); - - registerProvider(SOCIAL_SUBJ_LOGGER, SOCIAL_HISTORY_PRIV); - registerProvider(SOCIAL_SUBJ_FREQUENCY, SOCIAL_HISTORY_PRIV); - registerProvider(SOCIAL_SUBJ_FREQ_ADDRESS, SOCIAL_HISTORY_PRIV); -#endif - - return true; -} diff --git a/src/statistics/app/ActiveWindowMonitor.cpp b/src/statistics/app/ActiveWindowMonitor.cpp deleted file mode 100644 index c8d3120..0000000 --- a/src/statistics/app/ActiveWindowMonitor.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include - -#include -#include -#include "../shared/SystemInfo.h" -#include "AppStatisticsTypes.h" -#include "ActiveWindowMonitor.h" - -/* Active window changes frequently. - * We thus consider the apps being foregrounded at least 3 secs */ -#define ONE_DAY_IN_SEC 86400 - -ctx::AppUseMonitor::AppUseMonitor() : - __signalId(-1), - __lastCleanupTime(0), - __dbusWatcher(DBusType::SYSTEM) -{ - __startLogging(); -} - -ctx::AppUseMonitor::~AppUseMonitor() -{ - __stopLogging(); -} - -bool ctx::AppUseMonitor::__startLogging() -{ - __signalId = __dbusWatcher.watch(NULL, "/Org/Tizen/Aul/AppStatus", "org.tizen.aul.AppStatus", "AppStatusChange", this); - _D("Active window monitoring started (%lld)", __signalId); - return (__signalId > 0); -} - -void ctx::AppUseMonitor::__stopLogging() -{ - if (__signalId > 0) { - __dbusWatcher.unwatch(__signalId); - _D("Active window monitoring stopped"); - } -} - -void ctx::AppUseMonitor::onSignal(const char* sender, const char* path, const char* iface, const char* name, GVariant* param) -{ - gint pid = 0; - const gchar *appId = NULL; - const gchar *pkgId = NULL; - const gchar *status = NULL; - const gchar *type = NULL; - - g_variant_get(param, "(i&s&s&s&s)", &pid, &appId, &pkgId, &status, &type); - _D("AppEvent: %s, %s, %s", appId, status, type); - - IF_FAIL_VOID(appId && status && type); - IF_FAIL_VOID(STR_EQ(type, "uiapp") && !__isSkippable(appId)); - - if (STR_EQ(status, "fg")) { - __createRecord(appId); - } else if (STR_EQ(status, "bg")) { - __finishRecord(appId); - __removeExpired(); - } -} - -void ctx::AppUseMonitor::__createRecord(std::string appId) -{ - int audioJack; - int systemVolume; - int mediaVolume; - std::string bssid; - Json data; - data.set(NULL, STATS_APP_ID, appId); - - if (ctx::system_info::getAudioJackState(&audioJack)) - data.set(NULL, STATS_AUDIO_JACK, audioJack); - - if (ctx::system_info::getVolume(&systemVolume, &mediaVolume)) { - data.set(NULL, STATS_SYSTEM_VOLUME, systemVolume); - data.set(NULL, STATS_MEDIA_VOLUME, mediaVolume); - } - - if (ctx::system_info::getWifiBssid(bssid)) - data.set(NULL, STATS_BSSID, bssid); - - __dbManager.insert(0, APP_TABLE_USAGE_LOG, data, NULL); -} - -void ctx::AppUseMonitor::__finishRecord(std::string appId) -{ - /* TODO: It might be necessary to update system status here */ - std::stringstream query; - query << - "UPDATE " APP_TABLE_USAGE_LOG \ - " SET " STATS_DURATION " = strftime('%s', 'now') - " STATS_UNIV_TIME \ - " WHERE " STATS_COL_ROW_ID " = (" \ - "SELECT MAX(" STATS_COL_ROW_ID ") FROM " APP_TABLE_USAGE_LOG \ - " WHERE " STATS_APP_ID " = '" << appId << "'" \ - " AND " STATS_DURATION " = 0)"; - __dbManager.execute(0, query.str().c_str(), NULL); -} - -bool ctx::AppUseMonitor::__isSkippable(std::string appId) -{ - /* TODO: circular cache */ - app_info_h appInfo = NULL; - int err = app_manager_get_app_info(appId.c_str(), &appInfo); - IF_FAIL_RETURN_TAG(err == APP_MANAGER_ERROR_NONE && appInfo, true, _E, "app_manager_get_app_info() failed"); - - bool nodisp = false; - err = app_info_is_nodisplay(appInfo, &nodisp); - if (err != APP_MANAGER_ERROR_NONE) { - app_info_destroy(appInfo); - _E("app_info_is_nodisplay() failed"); - return true; - } - - app_info_destroy(appInfo); - return nodisp; -} - -void ctx::AppUseMonitor::__removeExpired() -{ - int timestamp = static_cast(time(NULL)); - IF_FAIL_VOID(timestamp - __lastCleanupTime >= ONE_DAY_IN_SEC); - - __lastCleanupTime = timestamp; - - std::stringstream query; - query << "DELETE FROM " APP_TABLE_USAGE_LOG " WHERE " \ - STATS_UNIV_TIME " < strftime('%s', 'now') - " << LOG_RETENTION_PERIOD; - __dbManager.execute(0, query.str().c_str(), NULL); -} diff --git a/src/statistics/app/ActiveWindowMonitor.h b/src/statistics/app/ActiveWindowMonitor.h deleted file mode 100644 index 64f0d34..0000000 --- a/src/statistics/app/ActiveWindowMonitor.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_APP_USE_MONITOR_H_ -#define _CONTEXT_STATS_APP_USE_MONITOR_H_ - -#include -#include -#include -#include - -namespace ctx { - - class AppUseMonitor : public IDBusSignalListener { - private: - int64_t __signalId; - int __lastCleanupTime; - DBusSignalWatcher __dbusWatcher; - DatabaseManager __dbManager; - - bool __startLogging(void); - void __stopLogging(void); - - bool __isSkippable(std::string appId); - void __createRecord(std::string appId); - void __finishRecord(std::string appId); - void __removeExpired(); - void onSignal(const char *sender, const char *path, const char *iface, const char *name, GVariant *param); - - public: - AppUseMonitor(); - ~AppUseMonitor(); - }; /* class AppUseMonitor */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_STATS_APP_USE_MONITOR_H_ */ diff --git a/src/statistics/app/AppStatisticsTypes.h b/src/statistics/app/AppStatisticsTypes.h deleted file mode 100644 index 42b049e..0000000 --- a/src/statistics/app/AppStatisticsTypes.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_APP_TYPES_H_ -#define _CONTEXT_STATS_APP_TYPES_H_ - -#include "../shared/CommonTypes.h" - -#define APP_HISTORY_PRIV "apphistory.read" -#define APP_SUBJ_LOGGER "stats/app/logger" -#define APP_SUBJ_RECENTLY_USED "stats/app/recently" -#define APP_SUBJ_FREQUENTLY_USED "stats/app/often" -#define APP_SUBJ_RARELY_USED "stats/app/rarely" -#define APP_SUBJ_PEAK_TIME "stats/app/peak_time" -#define APP_SUBJ_COMMON_SETTING "stats/app/setting" -#define APP_SUBJ_FREQUENCY "stats/app/frequency" - -#define APP_TABLE_REMOVABLE_APP "Log_RemovableApp" -#define APP_TABLE_REMOVABLE_APP_COLUMNS \ - "AppId TEXT NOT NULL UNIQUE" - -#define APP_TABLE_USAGE_LOG "Log_AppLaunch" -#define APP_TABLE_USAGE_LOG_COLUMNS \ - "AppId TEXT NOT NULL, Duration INTEGER NOT NULL DEFAULT 0, " \ - "SystemVolume INTEGER, MediaVolume INTEGER, AudioJack INTEGER, " \ - "BSSID TEXT, " \ - "UTC TIMESTAMP DEFAULT (strftime('%s', 'now')), " \ - "LocalTime TIMESTAMP DEFAULT (strftime('%s', 'now', 'localtime'))" - -#define APP_TEMP_USAGE_FREQ "Temp_AppLaunchFreq" -#define APP_TEMP_USAGE_FREQ_SQL \ - "CREATE TABLE IF NOT EXISTS " APP_TEMP_USAGE_FREQ \ - " (AppId TEXT NOT NULL UNIQUE, TotalCount INTEGER DEFAULT 0);" - -#endif /* End of _CONTEXT_STATS_APP_TYPES_H_ */ diff --git a/src/statistics/app/AppStatsLogger.cpp b/src/statistics/app/AppStatsLogger.cpp deleted file mode 100644 index 9bbb390..0000000 --- a/src/statistics/app/AppStatsLogger.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "AppStatisticsTypes.h" -#include "AppStatsLogger.h" - -using namespace ctx; - -AppStatsLogger::AppStatsLogger() : - ContextProvider(APP_SUBJ_LOGGER), - __initializer(NULL), - __installMon(NULL), - __launchMon(NULL) -{ - __initializer = new(std::nothrow) AppDbInitializer(); - IF_FAIL_VOID_TAG(__initializer, _E, "Memory allocation failed"); - - __installMon = new(std::nothrow) AppInstallMonitor(); - __launchMon = new(std::nothrow) AppUseMonitor(); - IF_FAIL_CATCH_TAG(__installMon && __launchMon, _E, "Memory allocation failed"); - return; - -CATCH: - delete __installMon; - delete __launchMon; - __installMon = NULL; - __launchMon = NULL; -} - -AppStatsLogger::~AppStatsLogger() -{ - delete __installMon; - delete __launchMon; -} - -int AppStatsLogger::subscribe(Json option, Json* requestResult) -{ - return ERR_NONE; -} - -int AppStatsLogger::unsubscribe(Json option) -{ - return ERR_NONE; -} diff --git a/src/statistics/app/AppStatsLogger.h b/src/statistics/app/AppStatsLogger.h deleted file mode 100644 index b2104dd..0000000 --- a/src/statistics/app/AppStatsLogger.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_APP_STATS_LOGGER_H_ -#define _CONTEXT_APP_STATS_LOGGER_H_ - -#include -#include "DbInit.h" -#include "InstallMonitor.h" -#include "ActiveWindowMonitor.h" - -namespace ctx { - - class AppStatsLogger : public ContextProvider { - public: - AppStatsLogger(); - ~AppStatsLogger(); - - int subscribe(Json option, Json *requestResult); - int unsubscribe(Json option); - - void submitTriggerItem() {} - - private: - AppDbInitializer *__initializer; - AppInstallMonitor *__installMon; - AppUseMonitor *__launchMon; - }; - -} /* namespace ctx */ - -#endif /* _CONTEXT_APP_STATS_LOGGER_H_ */ diff --git a/src/statistics/app/AppStatsProvider.cpp b/src/statistics/app/AppStatsProvider.cpp deleted file mode 100644 index 7e18049..0000000 --- a/src/statistics/app/AppStatsProvider.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "AppStatsProvider.h" -#include "DbHandle.h" - -using namespace ctx; - -AppStatsProvider::AppStatsProvider(const char *subject) : - ContextProvider(subject) -{ -} - -AppStatsProvider::~AppStatsProvider() -{ -} - -void AppStatsProvider::submitTriggerItem() -{ -} - -int AppStatsProvider::read(Json option, Json *requestResult) -{ - AppDbHandle *handle = new(std::nothrow) AppDbHandle(this); - IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); - - int err = handle->read(option); - if (err != ERR_NONE) { - delete handle; - return err; - } - - return ERR_NONE; -} - -void AppFreqProvider::submitTriggerItem() -{ - registerTriggerItem(OPS_READ, - "{" TRIG_DEF_RANK "," TRIG_DEF_TOTAL_COUNT "}", - "{" - "\"AppId\":{\"type\":\"string\"}," - TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK - "}"); -} diff --git a/src/statistics/app/AppStatsProvider.h b/src/statistics/app/AppStatsProvider.h deleted file mode 100644 index dccb66a..0000000 --- a/src/statistics/app/AppStatsProvider.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_APP_STATS_PROVIDER_H_ -#define _CONTEXT_APP_STATS_PROVIDER_H_ - -#include -#include "AppStatisticsTypes.h" - -namespace ctx { - - class AppStatsProvider : public ContextProvider { - public: - int read(Json option, Json *requestResult); - virtual void submitTriggerItem(); - - protected: - AppStatsProvider(const char *subject); - virtual ~AppStatsProvider(); - }; - - - class RecentAppProvider : public AppStatsProvider { - public: - RecentAppProvider() : - AppStatsProvider(APP_SUBJ_RECENTLY_USED) {} - }; - - - class FrequentAppProvider : public AppStatsProvider { - public: - FrequentAppProvider() : - AppStatsProvider(APP_SUBJ_FREQUENTLY_USED) {} - }; - - - class RareAppProvider : public AppStatsProvider { - public: - RareAppProvider() : - AppStatsProvider(APP_SUBJ_RARELY_USED) {} - }; - - - class AppPeakTimeProvider : public AppStatsProvider { - public: - AppPeakTimeProvider() : - AppStatsProvider(APP_SUBJ_PEAK_TIME) {} - }; - - - class AppSettingProvider : public AppStatsProvider { - public: - AppSettingProvider() : - AppStatsProvider(APP_SUBJ_COMMON_SETTING) {} - }; - - - class AppFreqProvider : public AppStatsProvider { - public: - AppFreqProvider() : - AppStatsProvider(APP_SUBJ_FREQUENCY) {} - - void submitTriggerItem(); - }; - -} /* namespace ctx */ - -#endif /* _CONTEXT_APP_STATS_PROVIDER_H_ */ diff --git a/src/statistics/app/DbHandle.cpp b/src/statistics/app/DbHandle.cpp deleted file mode 100644 index 06021e3..0000000 --- a/src/statistics/app/DbHandle.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "AppStatisticsTypes.h" -#include "DbHandle.h" - -using namespace ctx; - -AppDbHandle::AppDbHandle(ContextProvider *provider) : - StatsDbHandleBase(provider) -{ -} - -AppDbHandle::~AppDbHandle() -{ -} - -int AppDbHandle::read(Json filter) -{ - std::string query; - const char *subject = reqProvider->getSubject(); - - if (STR_EQ(subject, APP_SUBJ_RECENTLY_USED)) { - query = createSqlRecentlyUsed(filter); - - } else if (STR_EQ(subject, APP_SUBJ_FREQUENTLY_USED)) { - query = createSqlFrequentlyUsed(filter); - - } else if (STR_EQ(subject, APP_SUBJ_RARELY_USED)) { - query = createSqlRarelyUsed(filter); - - } else if (STR_EQ(subject, APP_SUBJ_PEAK_TIME)) { - query = createSqlPeakTime(filter); - - } else if (STR_EQ(subject, APP_SUBJ_COMMON_SETTING)) { - query = createSqlCommonSetting(filter); - - } else if (STR_EQ(subject, APP_SUBJ_FREQUENCY)) { - isTriggerItem = true; - query = createSqlFrequency(filter); - } - - IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); - - bool ret = executeQuery(filter, query.c_str()); - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - - return ERR_NONE; -} - -std::string AppDbHandle::createWhereClauseWithDeviceStatus(Json filter) -{ - std::stringstream whereClause; - std::string bssid; - int audioJack; - - whereClause << StatsDbHandleBase::createWhereClause(filter); - - if (filter.get(NULL, STATS_BSSID, &bssid)) - whereClause << " AND " STATS_BSSID " = '" << bssid << "'"; - - if (filter.get(NULL, STATS_AUDIO_JACK, &audioJack)) - whereClause << " AND " STATS_AUDIO_JACK " = " << audioJack; - - return whereClause.str(); -} - -std::string AppDbHandle::createSqlPeakTime(Json filter) -{ - return StatsDbHandleBase::createSqlPeakTime(filter, APP_TABLE_USAGE_LOG, createWhereClause(filter)); -} - -std::string AppDbHandle::createSqlCommonSetting(Json filter) -{ - return StatsDbHandleBase::createSqlCommonSetting(filter, APP_TABLE_USAGE_LOG, createWhereClause(filter)); -} - -std::string AppDbHandle::createSqlFrequency(Json filter) -{ - Json filterCleaned; - std::string weekStr; - std::string timeOfDay; - std::string appId; - - if (!filter.get(NULL, STATS_APP_ID, &appId)) { - _E("Invalid parameter"); - return ""; - } - - if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) - filterCleaned.set(NULL, STATS_DAY_OF_WEEK, weekStr); - - if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) - filterCleaned.set(NULL, STATS_TIME_OF_DAY, timeOfDay); - - std::string whereClause = createWhereClause(filterCleaned); - - std::stringstream query; - - query << - "DELETE FROM " APP_TEMP_USAGE_FREQ ";"; - - query << - "INSERT INTO " APP_TEMP_USAGE_FREQ \ - " SELECT " STATS_APP_ID ", COUNT(*) AS " STATS_TOTAL_COUNT \ - " FROM " APP_TABLE_USAGE_LOG \ - " WHERE " << whereClause << - " GROUP BY " STATS_APP_ID ";"; - - query << - "INSERT OR IGNORE INTO " APP_TEMP_USAGE_FREQ " (" STATS_APP_ID ")" \ - " VALUES ('" << appId << "');"; - - query << - "SELECT S." STATS_APP_ID ", S." STATS_TOTAL_COUNT ", 1+COUNT(lesser." STATS_TOTAL_COUNT ") AS " STATS_RANK \ - " FROM " APP_TEMP_USAGE_FREQ " AS S" \ - " LEFT JOIN " APP_TEMP_USAGE_FREQ " AS lesser" \ - " ON S." STATS_TOTAL_COUNT " < lesser." STATS_TOTAL_COUNT \ - " WHERE S." STATS_APP_ID " = '" << appId << "'"; - - return query.str(); -} - -std::string AppDbHandle::createSqlRecentlyUsed(Json filter) -{ - std::stringstream query; - int limit = DEFAULT_LIMIT; - - filter.get(NULL, STATS_RESULT_SIZE, &limit); - - query << - "SELECT " STATS_APP_ID ", " \ - "COUNT(*) AS " STATS_TOTAL_COUNT ", " \ - "SUM(" STATS_DURATION ") AS " STATS_TOTAL_DURATION ", " \ - "MAX(" STATS_UNIV_TIME ") AS " STATS_LAST_TIME \ - " FROM " APP_TABLE_USAGE_LOG \ - " WHERE " << createWhereClauseWithDeviceStatus(filter) << - " GROUP BY " STATS_APP_ID \ - " ORDER BY MAX(" STATS_UNIV_TIME ") DESC" \ - " LIMIT " << limit; - - return query.str(); -} - -std::string AppDbHandle::createSqlFrequentlyUsed(Json filter) -{ - std::stringstream query; - int limit = DEFAULT_LIMIT; - - filter.get(NULL, STATS_RESULT_SIZE, &limit); - - query << - "SELECT " STATS_APP_ID ", " \ - "COUNT(*) AS " STATS_TOTAL_COUNT ", " \ - "SUM(" STATS_DURATION ") AS " STATS_TOTAL_DURATION ", " \ - "MAX(" STATS_UNIV_TIME ") AS " STATS_LAST_TIME \ - " FROM " APP_TABLE_USAGE_LOG \ - " WHERE " << createWhereClauseWithDeviceStatus(filter) << - " GROUP BY " STATS_APP_ID \ - " ORDER BY COUNT(*) DESC" \ - " LIMIT " << limit; - - return query.str(); -} - -std::string AppDbHandle::createSqlRarelyUsed(Json filter) -{ - std::stringstream query; - int limit = DEFAULT_LIMIT; - - filter.get(NULL, STATS_RESULT_SIZE, &limit); - - query << - "SELECT i." STATS_APP_ID ", " \ - "COUNT(u." STATS_DURATION ") AS " STATS_TOTAL_COUNT ", " \ - "IFNULL(SUM(u." STATS_DURATION "),0) AS " STATS_TOTAL_DURATION ", " \ - "IFNULL(MAX(u." STATS_UNIV_TIME "),-1) AS " STATS_LAST_TIME \ - " FROM " APP_TABLE_REMOVABLE_APP " i LEFT OUTER JOIN (" \ - " SELECT * FROM " APP_TABLE_USAGE_LOG \ - " WHERE " << createWhereClauseWithDeviceStatus(filter) << ") u" \ - " ON i." STATS_APP_ID " = u." STATS_APP_ID \ - " GROUP BY i." STATS_APP_ID \ - " ORDER BY " STATS_TOTAL_COUNT " ASC" \ - " LIMIT " << limit; - - return query.str(); -} - -void AppDbHandle::replyTriggerItem(int error, Json &jsonResult) -{ - IF_FAIL_VOID_TAG(STR_EQ(reqProvider->getSubject(), APP_SUBJ_FREQUENCY), _E, "Invalid subject"); - - Json results; - std::string valStr; - int val; - - jsonResult.get(NULL, STATS_APP_ID, &valStr); - results.set(NULL, STATS_APP_ID, valStr); - jsonResult.get(NULL, STATS_TOTAL_COUNT, &val); - results.set(NULL, STATS_TOTAL_COUNT, val); - jsonResult.get(NULL, STATS_RANK, &val); - results.set(NULL, STATS_RANK, val); - - reqProvider->replyToRead(reqFilter, error, results); -} diff --git a/src/statistics/app/DbHandle.h b/src/statistics/app/DbHandle.h deleted file mode 100644 index 9084d87..0000000 --- a/src/statistics/app/DbHandle.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_APP_DB_HANDLE_H_ -#define _CONTEXT_STATS_APP_DB_HANDLE_H_ - -#include -#include -#include "../shared/DbHandleBase.h" - -namespace ctx { - class AppDbHandle : public StatsDbHandleBase { - public: - AppDbHandle(ContextProvider *provider); - ~AppDbHandle(); - - int read(Json filter); - - protected: - std::string createWhereClauseWithDeviceStatus(Json filter); - std::string createSqlRecentlyUsed(Json filter); - std::string createSqlFrequentlyUsed(Json filter); - std::string createSqlRarelyUsed(Json filter); - std::string createSqlPeakTime(Json filter); - std::string createSqlCommonSetting(Json filter); - std::string createSqlFrequency(Json filter); - void replyTriggerItem(int error, Json &jsonResult); - }; -} - -#endif /* End of _CONTEXT_STATS_APP_DB_HANDLE_H_ */ diff --git a/src/statistics/app/DbInit.cpp b/src/statistics/app/DbInit.cpp deleted file mode 100644 index 9c4ec24..0000000 --- a/src/statistics/app/DbInit.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "AppStatisticsTypes.h" -#include "DbInit.h" - -#define EMPTY_CHECKER_QID 999 - -ctx::AppDbInitializer::AppDbInitializer() -{ - __createTable(); - __checkAppList(); -} - -ctx::AppDbInitializer::~AppDbInitializer() -{ -} - -void ctx::AppDbInitializer::__createTable() -{ - static bool done = false; - IF_FAIL_VOID(!done); - - __dbManager.createTable(0, APP_TABLE_USAGE_LOG, APP_TABLE_USAGE_LOG_COLUMNS, NULL, NULL); - __dbManager.createTable(0, APP_TABLE_REMOVABLE_APP, APP_TABLE_REMOVABLE_APP_COLUMNS, NULL, NULL); - __dbManager.execute(0, APP_TEMP_USAGE_FREQ_SQL, NULL); - - done = true; -} - -void ctx::AppDbInitializer::__checkAppList() -{ - __dbManager.execute(EMPTY_CHECKER_QID, "SELECT * FROM " APP_TABLE_REMOVABLE_APP " LIMIT 1", this); -} - -void ctx::AppDbInitializer::__duplicateAppList() -{ - int err; - package_manager_filter_h filter; - - err = package_manager_filter_create(&filter); - IF_FAIL_VOID_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_filter_create() failed"); - - err = package_manager_filter_add_bool(filter, PACKAGE_MANAGER_PKGINFO_PROP_REMOVABLE, true); - IF_FAIL_CATCH_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_filter_add_bool() failed"); - - err = package_manager_filter_foreach_package_info(filter, __packageInfoCb, this); - IF_FAIL_CATCH_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_filter_foreach_package_info() failed"); - -CATCH: - if (filter) - package_manager_filter_destroy(filter); -} - -bool ctx::AppDbInitializer::__packageInfoCb(package_info_h packageInfo, void *userData) -{ - int err = package_info_foreach_app_from_package(packageInfo, PACKAGE_INFO_UIAPP, __appInfoCb, userData); - IF_FAIL_RETURN_TAG(err == PACKAGE_MANAGER_ERROR_NONE, false, _E, "package_info_foreach_app_from_package() failed"); - return true; -} - -bool ctx::AppDbInitializer::__appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData) -{ - Json data; - DatabaseManager dbManager; - - data.set(NULL, STATS_APP_ID, appId); - return dbManager.insert(0, APP_TABLE_REMOVABLE_APP, data, NULL); -} - -void ctx::AppDbInitializer::onTableCreated(unsigned int queryId, int error) -{ -} - -void ctx::AppDbInitializer::onInserted(unsigned int queryId, int error, int64_t rowId) -{ -} - -void ctx::AppDbInitializer::onExecuted(unsigned int queryId, int error, std::vector& records) -{ - if (queryId != EMPTY_CHECKER_QID) { - _E("Unknown Query ID: %d", queryId); - delete this; - return; - } - - if (records.empty()) - __duplicateAppList(); - - delete this; -} diff --git a/src/statistics/app/DbInit.h b/src/statistics/app/DbInit.h deleted file mode 100644 index c8d18c2..0000000 --- a/src/statistics/app/DbInit.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_APP_DB_INITIALIZER_H_ -#define _CONTEXT_STATS_APP_DB_INITIALIZER_H_ - -#include -#include - -namespace ctx { - - class AppDbInitializer : public IDatabaseListener { - private: - void __createTable(); - void __checkAppList(); - void __duplicateAppList(); - - void onTableCreated(unsigned int queryId, int error); - void onInserted(unsigned int queryId, int error, int64_t rowId); - void onExecuted(unsigned int queryId, int error, std::vector& records); - - static bool __packageInfoCb(package_info_h packageInfo, void *userData); - static bool __appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData); - - DatabaseManager __dbManager; - - public: - AppDbInitializer(); - ~AppDbInitializer(); - }; - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_STATS_APP_DB_INITIALIZER_H_ */ diff --git a/src/statistics/app/InstallMonitor.cpp b/src/statistics/app/InstallMonitor.cpp deleted file mode 100644 index af5169f..0000000 --- a/src/statistics/app/InstallMonitor.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include -#include -#include "AppStatisticsTypes.h" -#include "InstallMonitor.h" - -static package_manager_event_type_e __lastEventType; - -ctx::AppInstallMonitor::AppInstallMonitor() : - __pkgmgrHandle(NULL) -{ - __startMonitoring(); -} - -ctx::AppInstallMonitor::~AppInstallMonitor() -{ - __stopMonitoring(); -} - -bool ctx::AppInstallMonitor::__startMonitoring() -{ - int err = package_manager_create(&__pkgmgrHandle); - IF_FAIL_RETURN_TAG(err == PACKAGE_MANAGER_ERROR_NONE, false, _E, "package_manager_create() failed"); - - err = package_manager_set_event_cb(__pkgmgrHandle, __packageEventCb, this); - IF_FAIL_RETURN_TAG(err == PACKAGE_MANAGER_ERROR_NONE, false, _E, "package_manager_set_event_cb() failed"); - - return true; -} - -void ctx::AppInstallMonitor::__stopMonitoring() -{ - if(__pkgmgrHandle) { - package_manager_unset_event_cb(__pkgmgrHandle); - package_manager_destroy(__pkgmgrHandle); - __pkgmgrHandle = NULL; - } -} - -void ctx::AppInstallMonitor::__packageEventCb(const char *type, const char *package, package_manager_event_type_e eventType, package_manager_event_state_e eventState, int progress, package_manager_error_e error, void *userData) -{ - IF_FAIL_VOID_TAG(error == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager error: %d", error); - - if (!(eventType == PACKAGE_MANAGER_EVENT_TYPE_INSTALL && eventState == PACKAGE_MANAGER_EVENT_STATE_COMPLETED) && - !(eventType == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL && eventState == PACKAGE_MANAGER_EVENT_STATE_STARTED)) { - _D("Skipping event type-%d / state-%d", eventType, eventState); - return; - } - - package_info_h pkgInfo; - int err = package_manager_get_package_info(package, &pkgInfo); - IF_FAIL_VOID_TAG(err == PACKAGE_MANAGER_ERROR_NONE, _E, "package_manager_get_package_info() failed"); - - __lastEventType = eventType; - - err = package_info_foreach_app_from_package(pkgInfo, PACKAGE_INFO_UIAPP, __appInfoCb, userData); - if (err != PACKAGE_MANAGER_ERROR_NONE) - _E("package_info_foreach_app_from_package() failed"); - - package_info_destroy(pkgInfo); -} - -bool ctx::AppInstallMonitor::__appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData) -{ - DatabaseManager dbManager; - - if (__lastEventType == PACKAGE_MANAGER_EVENT_TYPE_INSTALL) { - Json data; - data.set(NULL, STATS_APP_ID, appId); - dbManager.insert(0, APP_TABLE_REMOVABLE_APP, data, NULL); - } else if (__lastEventType == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL) { - dbManager.execute(0, __createDeletionQuery(APP_TABLE_REMOVABLE_APP, appId).c_str(), NULL); - dbManager.execute(0, __createDeletionQuery(APP_TABLE_USAGE_LOG, appId).c_str(), NULL); - } - - return true; -} - -std::string ctx::AppInstallMonitor::__createDeletionQuery(const char* tableName, const char* appId) -{ - std::stringstream query; - query << "DELETE FROM " << tableName; - query << " WHERE " STATS_APP_ID " = '" << appId << "'"; - return query.str(); -} diff --git a/src/statistics/app/InstallMonitor.h b/src/statistics/app/InstallMonitor.h deleted file mode 100644 index a022946..0000000 --- a/src/statistics/app/InstallMonitor.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_APP_INSTALL_MONITOR_H_ -#define _CONTEXT_STATS_APP_INSTALL_MONITOR_H_ - -#include -#include - -namespace ctx { - - class AppInstallMonitor : public IDatabaseListener { - private: - package_manager_h __pkgmgrHandle; - - bool __startMonitoring(); - void __stopMonitoring(); - - static std::string __createDeletionQuery(const char* tableName, const char* appId); - static void __packageEventCb(const char *type, const char *package, package_manager_event_type_e eventType, package_manager_event_state_e eventState, int progress, package_manager_error_e error, void *userData); - static bool __appInfoCb(package_info_app_component_type_e compType, const char *appId, void *userData); - - void onTableCreated(unsigned int queryId, int error) {} - void onInserted(unsigned int queryId, int error, int64_t rowId) {} - void onExecuted(unsigned int queryId, int error, std::vector& records) {} - - public: - AppInstallMonitor(); - ~AppInstallMonitor(); - }; - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_STATS_APP_INSTALL_MONITOR_H_ */ diff --git a/src/statistics/app/app_inactive_detector/AppInactiveDetector.cpp b/src/statistics/app/app_inactive_detector/AppInactiveDetector.cpp deleted file mode 100644 index 148d655..0000000 --- a/src/statistics/app/app_inactive_detector/AppInactiveDetector.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "AppInactiveDetector.h" -#include "AppInactiveDetectorTypes.h" -#include "InactiveDetector.h" - - -ctx::app_inactive_detector_provider *ctx::app_inactive_detector_provider::__instance = NULL; - -ctx::app_inactive_detector_provider::app_inactive_detector_provider() -{ -} - -ctx::app_inactive_detector_provider::~app_inactive_detector_provider() -{ -} - -ctx::ContextProvider *ctx::app_inactive_detector_provider::create(void *data) -{ - IF_FAIL_RETURN(!__instance, __instance); - __instance = new(std::nothrow) app_inactive_detector_provider(); - IF_FAIL_RETURN_TAG(__instance, NULL, _E, "Memory allocation failed"); - _I(BLUE("Created")); - return __instance; -} - -void ctx::app_inactive_detector_provider::destroy(void *data) -{ - IF_FAIL_VOID(__instance); - delete __instance; - __instance = NULL; - _I(BLUE("Destroyed")); -} - -int ctx::app_inactive_detector_provider::subscribe(const char *subject, ctx::Json option, ctx::Json* request_result) -{ - return ERR_NOT_SUPPORTED; -} - -int ctx::app_inactive_detector_provider::unsubscribe(const char *subject, ctx::Json option) -{ - return ERR_NOT_SUPPORTED; -} - -int ctx::app_inactive_detector_provider::read(const char *subject, ctx::Json option, ctx::Json* request_result) -{ - _I(BLUE("Read")); - _J("Option", option); - - int error = engine->read(subject, option); - return error == ERR_NONE ? ERR_NONE : error; -} - -int ctx::app_inactive_detector_provider::write(const char *subject, ctx::Json data, ctx::Json* request_result) -{ - return ERR_NOT_SUPPORTED; -} - -bool ctx::app_inactive_detector_provider::is_supported() -{ - return true; -} diff --git a/src/statistics/app/app_inactive_detector/AppInactiveDetector.h b/src/statistics/app/app_inactive_detector/AppInactiveDetector.h deleted file mode 100644 index 588130a..0000000 --- a/src/statistics/app/app_inactive_detector/AppInactiveDetector.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_APP_INACTIVE_DETECTOR_H__ -#define __CONTEXT_APP_INACTIVE_DETECTOR_H__ - -#include -#include "AppInactiveDetectorTypes.h" -#include "InactiveDetector.h" - -namespace ctx { - - class app_inactive_detector_provider : public ContextProvider { - - public: - static ContextProvider *create(void *data); - static void destroy(void *data); - static bool is_supported(); - - int subscribe(const char *subject, ctx::Json option, ctx::Json *request_result); - int unsubscribe(const char *subject, ctx::Json option); - int read(const char *subject, ctx::Json option, ctx::Json *request_result); - int write(const char *subject, ctx::Json data, ctx::Json *request_result); - - private: - static app_inactive_detector_provider *__instance; - inactive_detector *engine; - - app_inactive_detector_provider(); - ~app_inactive_detector_provider(); - - }; /* class app_inactive_detector_provider */ - -} /* namespace ctx */ - -#endif /* __CONTEXT_APP_INACTIVE_DETECTOR_H__ */ \ No newline at end of file diff --git a/src/statistics/app/app_inactive_detector/AppInactiveDetectorTypes.h b/src/statistics/app/app_inactive_detector/AppInactiveDetectorTypes.h deleted file mode 100644 index b058b54..0000000 --- a/src/statistics/app/app_inactive_detector/AppInactiveDetectorTypes.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_APP_INACTIVE_DETECTOR_TYPES__ -#define __CONTEXT_APP_INACTIVE_DETECTOR_TYPES__ - -#include - -// Context Items -//#define APP_INACTIVE_SUBJ_RECALCULATE "app/recalculate" -#define APP_INACTIVE_SUBJ_GET_APPS_INACTIVE "app/inactive" -#define APP_INACTIVE_SUBJ_GET_APPS_ACTIVE "app/active" -#define APP_INACTIVE_SUBJ_GET_APPS_WEIGHT "app/weight" -#define APP_INACTIVE_SUBJ_UPDATE_CLUSTERS "app/update" - -enum { - APP_INACTIVE_QUERY_ID_GET_APPS_WEIGHT = 1, - APP_INACTIVE_QUERY_ID_GET_APPS_INACTIVE = 2, - APP_INACTIVE_QUERY_ID_GET_APPS_ACTIVE = 3, - APP_INACTIVE_QUERY_ID_UPDATE_CLUSTERS = 4 -}; - -// Database -#define APP_INACTIVE_DETECTOR_APPINFO_TABLE "context_app_info" -#define APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "app_info" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID "_id" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "package_name" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_TYPE "package_type" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY "is_nodisplay" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED "is_enabled" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT "is_atboot" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED "is_preloaded" -#define APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP "timestamp" - -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE "context_app_launch_log" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS "app_launch_log" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_ID "_id" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_CONTEXT_APP_INFO_ID "context_app_info_id" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_DURATION "duration" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_SYSTEM_VOLUME "system_volume" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_BSSID "bssid" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP "timestamp" -#define APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP_UTC "timestamp_utc" - -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE "context_app_activity_classified" -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "app_activity_classified" -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_ID "_id" -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID "context_app_info_id" -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_ACTIVITY_RATE "activity_rate" -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME "timeframe" -#define APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE "is_active" - - -#define APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "virtual_app_history" -#define APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT "weight" - -// Output Data Key -#define APP_INACTIVE_DETECTOR_DATA_READ "AppsList" -#define APP_INACTIVE_DETECTOR_DATA_TIMESTAMP_FROM "timestamp_from" -#define APP_INACTIVE_DETECTOR_ACTIVITY_RATE "activity_rate" -#define APP_INACTIVE_DETECTOR_DATA_TIMEFRAME "timeframe" -#define APP_INACTIVE_DETECTOR_DATA_ISACTIVE "is_active" - -//Other -#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP "$timestamp" -#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER "$cluster" -#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME "$timeframe" -#define APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_VALUES "$values" - -// Objects -struct app_t { - int id; - std::string package_name; - int is_nodisplay; - int is_enabled; - int is_atboot; - int is_preloaded; - double timestamp; - int weight; - int is_active; - int timeframe; -}; - - -#define APP_TYPE_INACTIVE_INACTIVE 1 -#define APP_TYPE_INACTIVE_ACTIVE 2 - - -#define APP_INACTIVE_TASK_START_HOUR 3 -#define APP_INACTIVE_TASK_START_MINUTE 0 - - -#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEDAY 60*60*24 -#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_THREEDAYS 60*60*24*3 -#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEWEEK 60*60*24*7 -#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_TWOWEEKS 60*60*24*14 -#define CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEMONTH 60*60*24*31 - - - -#endif /* __CONTEXT_APP_INACTIVE_DETECTOR_TYPES__ */ \ No newline at end of file diff --git a/src/statistics/app/app_inactive_detector/InactiveDetector.cpp b/src/statistics/app/app_inactive_detector/InactiveDetector.cpp deleted file mode 100644 index 6cc1820..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetector.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "InactiveDetector.h" -#include "InactiveDetectorWeight.h" -#include "InactiveDetectorStorage.h" -#include "InactiveDetectorClassificator.h" -#include "TimerManager.h" - -ctx::inactive_detector::inactive_detector() -{ - timer_id = timer_mgr.setAt( // execute once every night - APP_INACTIVE_TASK_START_HOUR, - APP_INACTIVE_TASK_START_MINUTE, - DayOfWeek::EVERYDAY, - this); - if (timer_id < 0) { - _E("inactive_detector timer set FAIL"); - return; - } else { - update_clusters(); - _D("inactive_detector timer set SUCCESS"); - } - -} - -ctx::inactive_detector::~inactive_detector() -{ - if (timer_id >= 0) { - timer_mgr.remove(timer_id); - _D("inactive_detejctor timer removed"); - } - -} - -bool ctx::inactive_detector::onTimerExpired(int timerId) -{ - update_clusters(); - return true; -} - -int ctx::inactive_detector::update_clusters() -{ - // define timeframes stack - std::vector timeframes; - timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEDAY); - timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_THREEDAYS); - timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEWEEK); - timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_TWOWEEKS); - timeframes.push_back(CONTEXT_HISTORY_FILTER_TIME_INTERVAL_ONEMONTH); - - // recalculate weights - // foreach timeframe - for(std::vector::iterator timeframe = timeframes.begin(); - timeframe != timeframes.end(); timeframe++) - { - inactive_detector_weight i_detector_weight; - int error = i_detector_weight.request_weights(*timeframe); - _E("update_clusters request_weights:%d, error:%d", *timeframe, error); - } - - return ERR_NONE; -} - -void ctx::inactive_detector::on_cluster_update_finished(std::vector *apps_with_weight, int error) -{ - if (error == ERR_NONE) { - _I("on_cluster_update_finished success"); - } - // clean memory - delete apps_with_weight; -} - -int ctx::inactive_detector::read( - const char *subject, - ctx::Json option) -{ - ctx::inactive_detector_storage *handle = new(std::nothrow) ctx::inactive_detector_storage(); - IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); - - int err = handle->read(subject, option); - if (err != ERR_NONE) { - delete handle; - return err; - } - - return ERR_NONE; -} - -ctx::Json ctx::inactive_detector::to_json(std::vector *app_infos) -{ - ctx::Json data; - - for(std::vector::iterator app_info = app_infos->begin(); - app_info != app_infos->end(); app_info++) - { - ctx::Json app_j; - app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME, app_info->package_name); - app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY, app_info->is_nodisplay); - app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED, app_info->is_enabled); - app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT, app_info->is_atboot); - app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED, app_info->is_preloaded); - app_j.set(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP, app_info->timestamp); - } - return data; -} diff --git a/src/statistics/app/app_inactive_detector/InactiveDetector.h b/src/statistics/app/app_inactive_detector/InactiveDetector.h deleted file mode 100644 index 8c2d0a0..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetector.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_H__ -#define __CONTEXT_INACTIVE_DETECTOR_H__ - -#include -#include -#include -#include "AppInactiveDetectorTypes.h" -#include - -namespace ctx { - - class inactive_detector : public ITimerListener { - private: - int timer_id; - TimerManager timer_mgr; - public: - inactive_detector(); - ~inactive_detector(); - - int read(const char *subject, - ctx::Json option); - - int update_clusters(); - void on_cluster_update_finished( - std::vector *apps_classified, - int error); - ctx::Json to_json(std::vector *apps); - - bool onTimerExpired(int timerId); - }; /* class inactive_detector */ - -} /* namespace ctx */ - - -#endif /* __CONTEXT_INACTIVE_DETECTOR_H__ */ diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificator.cpp b/src/statistics/app/app_inactive_detector/InactiveDetectorClassificator.cpp deleted file mode 100644 index 5e5859b..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificator.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ -#include -#include "InactiveDetector.h" -#include "AppInactiveDetectorTypes.h" -#include "InactiveDetectorClassificator.h" -#include "InactiveDetectorClassificatorKmeans.h" - -int ctx::inactive_detector_classificator::classify(std::vector *apps_with_weights) -{ - inactive_detector_classificator_kmeans kmeans; - int error = kmeans.classify(apps_with_weights); - - return error; -} diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificator.h b/src/statistics/app/app_inactive_detector/InactiveDetectorClassificator.h deleted file mode 100644 index fc9abd0..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificator.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_H__ -#define __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_H__ - -#include -#include "AppInactiveDetectorTypes.h" -#include - -namespace ctx { - - class inactive_detector_classificator - { - public: - inactive_detector_classificator(); - ~inactive_detector_classificator(); - - int classify(std::vector *apps_with_weights); - }; /* class inactive_detector_classificator */ - -} /* namespace ctx */ - -#endif /* __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_H__ */ diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeans.cpp b/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeans.cpp deleted file mode 100644 index c0cb93e..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeans.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ -#include -#include "AppInactiveDetectorTypes.h" -#include "InactiveDetectorClassificatorKmeans.h" -#include "InactiveDetectorClassificatorKmeansTypes.h" -#include -#include - -double ctx::inactive_detector_classificator_kmeans::randomf(double x) -{ - return x * rand() / (RAND_MAX - 1.); -} - -double ctx::inactive_detector_classificator_kmeans::glide_function(double x) -{ - double value = sqrt(log(x) + 1); - return (value > 0 ? value : 0); -} - -point_s *ctx::inactive_detector_classificator_kmeans::reproject_to_2d(std::vector *apps_with_weights) -{ - int distr_size = apps_with_weights->size(); - point_s *p = new point_s[distr_size]; - - int i=0; - for(std::vector::iterator apps_with_weight = apps_with_weights->begin(); - apps_with_weight != apps_with_weights->end(); apps_with_weight++) - { - point_s the_point; - - the_point.x = glide_function(apps_with_weight->weight); // normalize weight values - the_point.y = 0; //remove 3rd dimension of the data - the_point.origin_id = apps_with_weight->package_name; - - p[i] = the_point; - i++; - } - - return p; -} - -bool ctx::inactive_detector_classificator_kmeans::annotate_data(std::vector *apps_with_weights, point_s *c) -{ - int i=0, max_group=-1; - - for(std::vector::iterator apps_with_weight = apps_with_weights->begin(); - apps_with_weight != apps_with_weights->end(); apps_with_weight++) - { - apps_with_weight->is_active = c[i].group; - i++; - max_group = c[i].group > max_group ? c[i].group : max_group; - } - - return max_group == APP_INACTIVE_DETECTOR_KMEANS_CLUSTER_COUNT; -} - -double ctx::inactive_detector_classificator_kmeans::distance_to(point_s *p_from, - point_s *p_to) -{ - double x = p_from->x - p_to->x, y = p_from->y - p_to->y; - return x*x + y*y; -} - -int ctx::inactive_detector_classificator_kmeans::nearest(point_s *pt, - point_s *centers, - int cluster_number, - double *distance) -{ - int i; - int min_i = pt->group; - point_s *c; - - double d; - double min_d = HUGE_VAL; - - for_n { - if (min_d >(d = distance_to(c, pt))) { - min_d = d; min_i = i; - } - } - - if (distance) *distance = min_d; - return min_i; -} - -void ctx::inactive_detector_classificator_kmeans::kpp(point_s *points, int length, point_s *centers, int cluster_number) -{ - int j; - int n_cluster; - double sum; - double *d = new double[length]; - - point_s *p; - centers[0] = points[rand() % length]; - for (n_cluster = 1; n_cluster < cluster_number; n_cluster++) { - sum = 0; - for_len{ - nearest(p, centers, n_cluster, d + j); - sum += d[j]; - } - sum = randomf(sum); - for_len{ - if ((sum -= d[j]) > 0) continue; - centers[n_cluster] = points[j]; - break; - } - } - for_len p->group = nearest(p, centers, n_cluster, 0); - - delete d; -} - -point_s *ctx::inactive_detector_classificator_kmeans::lloyd(point_s *points, int length, int cluster_number) -{ - int i, j, min_i; - int changed; - - point_s *centers = new point_s; - point_s *p, *c; - - /* k++ init */ - kpp(points, length, centers, cluster_number); - - do { - /* group element for centroids are used as counters */ - for_n{ c->group = 0; c->x = c->y = 0; } - for_len{ - c = centers + p->group; - c->group++; - c->x += p->x; c->y += p->y; - } - for_n{ c->x /= c->group; c->y /= c->group; } - - changed = 0; - /* find closest centroid of each point */ - for_len{ - min_i = nearest(p, centers, cluster_number, 0); - if (min_i != p->group) { - changed++; - p->group = min_i; - } - } - } while (changed > (length >> 10)); /* stop when 99.9% of points are good */ - - for_n{ c->group = i; } - - return centers; -} - -int ctx::inactive_detector_classificator_kmeans::classify(std::vector *apps_with_weights) -{ - //array of generated points - point_s *v = reproject_to_2d(apps_with_weights); - //mark cluster for each point, output centers - point_s *c = lloyd(v, apps_with_weights->size(), APP_INACTIVE_DETECTOR_KMEANS_CLUSTER_COUNT); - //append the result to input data - bool classification_is_success = annotate_data(apps_with_weights, c); - - return classification_is_success ? ERR_NONE : ERR_OPERATION_FAILED; -} diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeans.h b/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeans.h deleted file mode 100644 index adc1fe8..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeans.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_H__ -#define __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_H__ - -#include -#include "InactiveDetectorClassificatorKmeansTypes.h" -#include - -namespace ctx { - - #define for_n for (c = centers, i = 0; i < cluster_number; i++, c++) - #define for_len for (j = 0, p = points; j < length; j++, p++) - - class inactive_detector_classificator_kmeans - { - private: - double randomf(double x); - double glide_function(double x); - point_s *reproject_to_2d(std::vector *apps_with_weights); - bool annotate_data(std::vector *apps_with_weights, point_s *c); - - double distance_to(point_s *p_from, point_s *p_to); - int nearest(point_s *pt, point_s *centers, int cluster_number, double *distance); - void kpp(point_s *points, int length, point_s *centers, int centers_count); - point_s *lloyd(point_s *points, int length, int cluster_number); - public: - inactive_detector_classificator_kmeans(); - ~inactive_detector_classificator_kmeans(); - - int classify(std::vector *apps_with_weights); - }; /* class inactive_detector_classificator_kmeans */ -} /* namespace ctx */ - -#endif /* __CONTEXT_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_H__ */ diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeansTypes.h b/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeansTypes.h deleted file mode 100644 index 8aa7270..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorClassificatorKmeansTypes.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_APP_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_TYPES__ -#define __CONTEXT_APP_INACTIVE_DETECTOR_CLASSIFICATOR_KMEANS_TYPES__ - -#define APP_INACTIVE_DETECTOR_KMEANS_CLUSTER_COUNT 2 - -typedef struct { - std::string origin_id; - double x; - double y; - int group; -} point_s; - -#endif \ No newline at end of file diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorStorage.cpp b/src/statistics/app/app_inactive_detector/InactiveDetectorStorage.cpp deleted file mode 100644 index 052c3fe..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorStorage.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include -#include -#include "InactiveDetector.h" -#include "InactiveDetectorStorage.h" -#include "InactiveDetectorStorageQueries.h" -#include "InactiveDetectorClassificator.h" -#include "AppInactiveDetectorTypes.h" - -/*int ctx::inactive_detector_storage::create_table() -{ - bool ret = __dbManager.createTable(0, WIFI_TABLE_NAME, WIFI_CREATE_TABLE_COLUMNS, NULL, NULL); - _D("Table Creation Request: %s", ret ? "SUCCESS" : "FAIL"); - return ret; -}*/ - - - -// expected Json format example: {timeframe: 1; is_active: 0} -int ctx::inactive_detector_storage::read( - const char *subject, - ctx::Json filter) -{ - std::string query; - query = query_get_apps(subject, filter); - - IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); - - bool ret = __dbManager.execute( - STR_EQ(subject, APP_INACTIVE_SUBJ_GET_APPS_INACTIVE) ? - APP_INACTIVE_QUERY_ID_GET_APPS_INACTIVE : - APP_INACTIVE_QUERY_ID_GET_APPS_ACTIVE, - query.c_str(), - this); - - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - - return ERR_NONE; -} - -std::string ctx::inactive_detector_storage::query_get_apps(const char *subject, ctx::Json filter) -{ - double timeframe; - int is_active; - - std::string query(GET_APP_INFO_INACTIVE_QUERY); - std::string placeholder_timeframe(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME); - std::string placeholder_is_active(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER); - - filter.get(NULL, APP_INACTIVE_DETECTOR_DATA_TIMEFRAME, &timeframe); - filter.get(NULL, APP_INACTIVE_DETECTOR_DATA_ISACTIVE, &is_active); - - std::stringstream timeframe_stream; - timeframe_stream << timeframe; - - std::stringstream is_active_stream; - is_active_stream << is_active; - - inject_params(query, placeholder_timeframe, timeframe_stream.str()); - inject_params(query, placeholder_is_active, is_active_stream.str()); - - return query; -} - -std::string ctx::inactive_detector_storage::query_update_apps(std::vector *apps_with_weights) -{ - std::string delete_query(DELETE_APP_ACTIVITY_CLASSIFIED_BY_TIMEFRAME); - std::string insert_query(INSERT_APP_ACTIVITY_CLASSIFIED); - std::string placeholder_timeframe(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME); - std::string placeholder_values(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_VALUES); - std::string placeholder_is_active(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER); - - std::stringstream timeframe_stream; - timeframe_stream << apps_with_weights->front().timeframe; - - inject_params(delete_query, placeholder_timeframe, timeframe_stream.str()); - inject_params(insert_query, placeholder_values, subquery_form_values(apps_with_weights)); - - std::stringstream result; - result << delete_query << insert_query; - return result.str(); -} - -// foreach app_info id+cluster -> select for insert -std::string ctx::inactive_detector_storage::subquery_form_values(std::vector *apps_with_weights) -{ - std::stringstream select_elements; - - for(std::vector::iterator row = apps_with_weights->begin(); - row != apps_with_weights->end(); row++) - { - //SELECT 1 as is_active, 1 as timeframe, 3964 as context_app_info_id - std::stringstream select_element; - select_element << " SELECT " << row->is_active << " as "; - select_element << APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE; - select_element << ", " << row->timeframe << " as "; - select_element << APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME; - select_element << ", " << row->id << " as "; - select_element << APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID; - - if ((row != apps_with_weights->end()) && (row == --apps_with_weights->end())) - select_element << " UNION "; - - select_elements << select_element; - } - - return select_elements.str(); -} - -void ctx::inactive_detector_storage::json_to_object(std::vector& records, - std::vector *apps_with_weights, bool result_mode) -{ - for(std::vector::iterator row = records.begin(); - row != records.end(); row++) - { - app_t app_with_weight; - if (result_mode) - { - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME, - &app_with_weight.package_name); - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY, - &app_with_weight.is_nodisplay); - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED, - &app_with_weight.is_enabled); - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT, - &app_with_weight.is_atboot); - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED, - &app_with_weight.is_preloaded); - row->get(NULL, APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT, - &app_with_weight.weight); - } - else - { - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID, - &app_with_weight.id); - row->get(NULL, APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP, - &app_with_weight.timestamp); - row->get(NULL, APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT, - &app_with_weight.weight); - row->get(NULL, APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE, - &app_with_weight.is_active); - } - - apps_with_weights->push_back(app_with_weight); - } -} - -void ctx::inactive_detector_storage::onExecuted(unsigned int query_id, - int error, - std::vector& records) -{ - if (error != ERR_NONE) { - _E("query_id:%d, error:%d", query_id, error); - return; - } - - std::vector *apps_with_weights = NULL; - if (query_id == APP_INACTIVE_QUERY_ID_GET_APPS_INACTIVE || - query_id == APP_INACTIVE_QUERY_ID_GET_APPS_ACTIVE) - { - json_to_object(records, apps_with_weights, TRUE); - } - else if (query_id == APP_INACTIVE_QUERY_ID_GET_APPS_WEIGHT) { - - json_to_object(records, apps_with_weights, FALSE); - - if (apps_with_weights->size() > 0) { - inactive_detector_classificator i_detector_classificator; - int _error = i_detector_classificator.classify(apps_with_weights); - - if(_error == ERR_NONE) - { - std::string query; - query = query_update_apps(apps_with_weights); - bool ret = __dbManager.execute(APP_INACTIVE_QUERY_ID_UPDATE_CLUSTERS, - query.c_str(), - this); - _D("load visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); - } - else - { - _E("classification query_id:%d, error:%d", - query_id, _error); - } - } - } - else if (query_id == APP_INACTIVE_QUERY_ID_UPDATE_CLUSTERS) { - _D("UPDATE_CLUSTERS execute query id: %d", query_id); - } - else { - _E("unknown query_id:%d", query_id); - } -} - -void ctx::inactive_detector_storage::inject_params(std::string& str, const std::string& from, const std::string& to) -{ - if(from.empty()) - return; - size_t start_pos = 0; - while((start_pos = str.find(from, start_pos)) != std::string::npos) { - str.replace(start_pos, from.length(), to); - start_pos += to.length(); - } -} - -// normalzie weights -int ctx::inactive_detector_storage::update_ranks() -{ - return ERR_NONE; -} - -int ctx::inactive_detector_storage::get_apps_info_w_weights( - double timestamp_from) -{ - std::stringstream timestamp_stream; - timestamp_stream << timestamp_from; - std::string timestamp_str = timestamp_stream.str(); - - std::string query(GET_APP_INFO_W_WEIGHT_QUERY); - std::string placeholder(APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP); - - inject_params(query, placeholder, timestamp_str); - - bool ret = __dbManager.execute(APP_INACTIVE_QUERY_ID_GET_APPS_WEIGHT, - query.c_str(), - this); - _D("load visits execute query result: %s", ret ? "SUCCESS" : "FAIL"); - - return ERR_NONE ; -} diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorStorage.h b/src/statistics/app/app_inactive_detector/InactiveDetectorStorage.h deleted file mode 100644 index 0eab066..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorStorage.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_STORAGE_H__ -#define __CONTEXT_INACTIVE_DETECTOR_STORAGE_H__ - -#include -#include "AppInactiveDetectorTypes.h" -#include -#include - -namespace ctx { - - class inactive_detector_storage : public IDatabaseListener - { - private: - //int type; //TODO: enum - void inject_params(std::string& str, - const std::string& from, - const std::string& to); - - void json_to_object(std::vector& records, - std::vector *apps_with_weights, bool result_mode); - - std::string query_get_apps(const char *subject, - ctx::Json filter); - - std::string query_update_apps(std::vector *apps_with_weights); - - std::string subquery_form_values(std::vector *apps_with_weights); - - void onTableCreated(unsigned int query_id, int error) {} - void onInserted(unsigned int query_id, int error, int64_t row_id) {} - void onExecuted(unsigned int query_id, int error, std::vector& records); - - DatabaseManager __dbManager; - - public: - inactive_detector_storage(); - ~inactive_detector_storage(); - - int read(const char *subject, - ctx::Json filter); - - int update_ranks(); - int get_apps_info_w_weights(double timestamp_from); - }; /* class inactive_detector_storage */ - -} /* namespace ctx */ - -#endif /* __CONTEXT_INACTIVE_DETECTOR_STORAGE_H__ */ diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorStorageQueries.h b/src/statistics/app/app_inactive_detector/InactiveDetectorStorageQueries.h deleted file mode 100644 index 4ef20d3..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorStorageQueries.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_STORAGE_QUERIES_H__ -#define __CONTEXT_INACTIVE_DETECTOR_STORAGE_QUERIES_H__ - -#include -#include "AppInactiveDetectorTypes.h" - -/* - ---1 calculate weights -SELECT - app_info._id, - app_info.package_name, - app_info.is_nodisplay, - app_info.is_enabled, - app_info.is_atboot, - app_info.is_preloaded, - app_info.timestamp, - - app_hist_g.weight as weight -FROM - context_app_info app_info - -INNER JOIN - - (SELECT - distinct package_name , - IFNULL((select count(package_name) from context_app_launch_log - where package_name == app_hist.package_name AND timestamp> 8640412900), 0 ) - * - IFNULL((select sum(duration) from context_app_launch_log - where package_name == app_hist.package_name AND timestamp> 8640412900) , 0) - as weight - - FROM context_app_launch_log app_hist -)app_hist_g - -ON app_hist_g.package_name -= -app_info.package_name - -ORDER BY app_hist_g.weight - -*/ - -#define GET_APP_INFO_W_WEIGHT_QUERY "SELECT "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_TYPE ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_TIMESTAMP ", "\ - ""\ - " " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT \ - ""\ - " FROM " APP_INACTIVE_DETECTOR_APPINFO_TABLE " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS \ - ""\ - " INNER JOIN " \ - " (SELECT "\ - " DISTINCT " APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "," \ - " IFNULL((SELECT COUNT(" APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME ")" \ - " FROM " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE \ - " WHERE " APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "==" APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ - " AND " \ - " " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP " >= " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP \ - "), 0) " \ - " * " \ - " IFNULL((SELECT SUM(" APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_DURATION ")" \ - " FROM " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE \ - " WHERE " APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME "==" APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ - " AND " \ - " " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_COLUMN_TIMESTAMP " >= " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMESTAMP \ - ""\ - "), 0) " \ - " as " APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT \ - " FROM " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE " " APP_INACTIVE_DETECTOR_APPLAUNCH_LOG_TABLE_ALIAS \ - ") " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS \ - " ON " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ - " = " \ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME \ - " ORDER BY " APP_INACTIVE_DETECTOR_VIRTUAL_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_VIRTUAL_COLUMN_WEIGHT - -/* ---2 select inner join context_app_info -SELECT - app_info.package_name, - app_info.is_nodisplay, - app_info.is_enabled, - app_info.is_atboot, - app_info.is_preloaded, - - activity_classified.activity_rate - -FROM - context_activity_classified activity_classified -INNER JOIN - context_app_info app_info -ON activity_classified.context_app_info_id = app_info._id - -WHERE - activity_classified.is_active = 1 - AND - activity_classified.timeframe = 1 -*/ - -#define GET_APP_INFO_INACTIVE_QUERY "SELECT "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_PACKAGE_NAME ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_NODISPLAY ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ENABLED ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_ATBOOT ", "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_IS_PRELOADED ", "\ - " "\ - " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_ACTIVITY_RATE " "\ - " FROM "\ - " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS " "\ - " INNER JOIN "\ - " " APP_INACTIVE_DETECTOR_APPINFO_TABLE " " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS " "\ - " ON " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID ""\ - " = " APP_INACTIVE_DETECTOR_APPINFO_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_APPINFO_COLUMN_ID " "\ - " WHERE "\ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE ""\ - " = " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_CLUSTER ""\ - " AND "\ - " " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE_ALIAS "." APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME ""\ - " = " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME "" - -/* ---3 update ranks and clusters for each timeframe: delete all for each time frame, add new calculations for apps -DELETE FROM - context_activity_classified -WHERE - timeframe = 1 -*/ - -#define DELETE_APP_ACTIVITY_CLASSIFIED_BY_TIMEFRAME "DELETE FROM "\ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE \ - " WHERE "\ - " timeframe = " APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_TIMEFRAME - - -/*INSERT INTO - context_activity_classified - (is_active, - timeframe, - context_app_info_id) -SELECT - is_active, - timeframe, - context_app_info_id -FROM --make loop - ( - SELECT 1 as is_active, 1 as timeframe, 3964 as context_app_info_id - UNION - SELECT 0 as is_active, 1 as timeframe, 3964 as context_app_info_id - ) q -*/ - -#define INSERT_APP_ACTIVITY_CLASSIFIED " INSERT INTO "\ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_TABLE \ - "( " APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE ", "\ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME ", "\ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID ")" \ -"SELECT " \ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_IS_ACTIVE "," \ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_TIMEFRAME ", "\ - APP_INACTIVE_DETECTOR_ACTIVITYCLASSIFIED_COLUMN_CONTEXT_APP_INFO_ID \ -"FROM"\ - "(" \ - APP_INACTIVE_DETECTOR_VALUE_PLACEHOLDER_VALUES \ - ") q" - - - -#endif /* __CONTEXT_INACTIVE_DETECTOR_STORAGE_QUERIES_H__ */ diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorWeight.cpp b/src/statistics/app/app_inactive_detector/InactiveDetectorWeight.cpp deleted file mode 100644 index 202301b..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorWeight.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include "InactiveDetectorWeight.h" -#include "InactiveDetectorStorage.h" - -int ctx::inactive_detector_weight::request_weights( - double timestamp_from) -{ - inactive_detector_storage ids; - // query the database for the result - int error = ids.get_apps_info_w_weights(timestamp_from); - - return error; -} diff --git a/src/statistics/app/app_inactive_detector/InactiveDetectorWeight.h b/src/statistics/app/app_inactive_detector/InactiveDetectorWeight.h deleted file mode 100644 index 8e87473..0000000 --- a/src/statistics/app/app_inactive_detector/InactiveDetectorWeight.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2015 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 __CONTEXT_INACTIVE_DETECTOR_WEIGHT_H__ -#define __CONTEXT_INACTIVE_DETECTOR_WEIGHT_H__ - -// #include -// #include - -namespace ctx { - - class inactive_detector_weight { - public: - inactive_detector_weight() {}; - ~inactive_detector_weight() {}; - int request_weights(double timestamp_from);// {}; - }; /* class inactive_detector_weight */ - -} /* namespace ctx */ - -#endif /* __CONTEXT_INACTIVE_DETECTOR_WEIGHT_H__ */ \ No newline at end of file diff --git a/src/statistics/media/DbHandle.cpp b/src/statistics/media/DbHandle.cpp deleted file mode 100644 index e8f0f03..0000000 --- a/src/statistics/media/DbHandle.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "../shared/SystemInfo.h" -#include "MediaStatisticsTypes.h" -#include "DbHandle.h" - -using namespace ctx; - -MediaDbHandle::MediaDbHandle(ContextProvider *provider) : - StatsDbHandleBase(provider) -{ -} - -MediaDbHandle::~MediaDbHandle() -{ -} - -int MediaDbHandle::read(Json filter) -{ - //TODO: filter validation (in the API side?) - std::string query; - const char *subject = reqProvider->getSubject(); - - if (STR_EQ(subject, MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC)) { - query = createSqlPeakTime(MEDIA_TYPE_MUSIC, filter); - - } else if (STR_EQ(subject, MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO)) { - query = createSqlPeakTime(MEDIA_TYPE_VIDEO, filter); - - } else if (STR_EQ(subject, MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC)) { - query = createSqlCommonSetting(MEDIA_TYPE_MUSIC, filter); - - } else if (STR_EQ(subject, MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO)) { - query = createSqlCommonSetting(MEDIA_TYPE_VIDEO, filter); - - } else if (STR_EQ(subject, MEDIA_SUBJ_MUSIC_FREQUENCY)) { - isTriggerItem = true; - query = createSqlFrequency(MEDIA_TYPE_MUSIC, filter); - - } else if (STR_EQ(subject, MEDIA_SUBJ_VIDEO_FREQUENCY)) { - isTriggerItem = true; - query = createSqlFrequency(MEDIA_TYPE_VIDEO, filter); - } - - IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); - - bool ret = executeQuery(filter, query.c_str()); - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - - return ERR_NONE; -} - -std::string MediaDbHandle::createWhereClause(int mediaType, Json filter) -{ - std::stringstream whereClause; - - whereClause << CX_MEDIA_TYPE " = " << mediaType << " AND "; - whereClause << StatsDbHandleBase::createWhereClause(filter); - - return whereClause.str(); -} - -std::string MediaDbHandle::createSqlPeakTime(int mediaType, Json filter) -{ - std::string where = createWhereClause(mediaType, filter); - return StatsDbHandleBase::createSqlPeakTime(filter, MEDIA_TABLE_NAME, where); -} - -std::string MediaDbHandle::createSqlCommonSetting(int mediaType, Json filter) -{ - std::string where = createWhereClause(mediaType, filter); - return StatsDbHandleBase::createSqlCommonSetting(filter, MEDIA_TABLE_NAME, where); -} - -std::string MediaDbHandle::createSqlFrequency(int mediaType, Json filter) -{ - Json filterCleaned; - std::string weekStr; - std::string timeOfDay; - - if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) - filterCleaned.set(NULL, STATS_DAY_OF_WEEK, weekStr); - - if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) - filterCleaned.set(NULL, STATS_TIME_OF_DAY, timeOfDay); - - std::string whereClause = createWhereClause(mediaType, filterCleaned); - - std::stringstream query; - query << - "SELECT IFNULL(COUNT(*),0) AS " STATS_TOTAL_COUNT \ - " FROM " MEDIA_TABLE_NAME \ - " WHERE " << whereClause; - - return query.str(); -} - -void MediaDbHandle::replyTriggerItem(int error, Json &jsonResult) -{ - IF_FAIL_VOID_TAG(STR_EQ(reqProvider->getSubject(), MEDIA_SUBJ_MUSIC_FREQUENCY) || - STR_EQ(reqProvider->getSubject(), MEDIA_SUBJ_VIDEO_FREQUENCY), _E, "Invalid subject"); - - Json results; - int val; - - jsonResult.get(NULL, STATS_TOTAL_COUNT, &val); - results.set(NULL, STATS_TOTAL_COUNT, val); - - reqProvider->replyToRead(reqFilter, error, results); -} diff --git a/src/statistics/media/DbHandle.h b/src/statistics/media/DbHandle.h deleted file mode 100644 index 8b7f1c1..0000000 --- a/src/statistics/media/DbHandle.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_MEDIA_DB_HANDLE_H_ -#define _CONTEXT_STATS_MEDIA_DB_HANDLE_H_ - -#include -#include -#include "../shared/DbHandleBase.h" - -namespace ctx { - class MediaDbHandle : public StatsDbHandleBase { - public: - MediaDbHandle(ContextProvider *provider); - ~MediaDbHandle(); - - int read(Json filter); - - protected: - std::string createWhereClause(int mediaType, Json filter); - std::string createSqlPeakTime(int mediaType, Json filter); - std::string createSqlCommonSetting(int mediaType, Json filter); - std::string createSqlFrequency(int mediaType, Json filter); - void replyTriggerItem(int error, Json &jsonResult); - }; -} - -#endif /* End of _CONTEXT_STATS_MEDIA_DB_HANDLE_H_ */ diff --git a/src/statistics/media/MediaContentMonitor.cpp b/src/statistics/media/MediaContentMonitor.cpp deleted file mode 100644 index 78ff0ef..0000000 --- a/src/statistics/media/MediaContentMonitor.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "../shared/SystemInfo.h" -#include "MediaStatisticsTypes.h" -#include "DbHandle.h" -#include "MediaContentMonitor.h" - -#define PLAYCOUNT_RETENTION_PERIOD 259200 /* 1 month in secs */ -#define ONE_DAY_IN_SEC 86400 - -ctx::MediaContentMonitor::MediaContentMonitor() : - __started(false), - __lastCleanupTime(0) -{ - __dbManager.createTable(0, MEDIA_TABLE_NAME, MEDIA_TABLE_COLUMNS, NULL, NULL); - __dbManager.execute(0, MEDIA_PLAYCOUNT_TABLE_SCHEMA, NULL); - - __started = __startMonitoring(); -} - -ctx::MediaContentMonitor::~MediaContentMonitor() -{ - if (__started) - __stopMonitoring(); -} - -bool ctx::MediaContentMonitor::__startMonitoring() -{ - int err; - err = media_content_connect(); - IF_FAIL_RETURN_TAG(err == MEDIA_CONTENT_ERROR_NONE, false, _E, "media_content_connect() failed"); - - err = media_content_set_db_updated_cb(__onMediaContentDbUpdated, this); - if (err != MEDIA_CONTENT_ERROR_NONE) { - media_content_disconnect(); - _E("media_content_set_db_updated_cb() failed"); - return false; - } - - return true; -} - -void ctx::MediaContentMonitor::__stopMonitoring() -{ - media_content_unset_db_updated_cb(); - media_content_disconnect(); -} - -void ctx::MediaContentMonitor::__onMediaContentDbUpdated( - media_content_error_e error, int pid, - media_content_db_update_item_type_e updateItem, - media_content_db_update_type_e updateType, - media_content_type_e mediaType, - char *uuid, char *path, char *mimeType, void *userData) -{ - IF_FAIL_VOID(error == MEDIA_CONTENT_ERROR_NONE && uuid != NULL); - IF_FAIL_VOID(updateItem == MEDIA_ITEM_FILE && updateType == MEDIA_CONTENT_UPDATE); - IF_FAIL_VOID(mediaType == MEDIA_CONTENT_TYPE_MUSIC || mediaType == MEDIA_CONTENT_TYPE_VIDEO); - - media_info_h media = NULL; - media_info_get_media_from_db(uuid, &media); - IF_FAIL_VOID_TAG(media, _E, "media_info_get_media_from_db() failed"); - - int cnt = -1; - media_info_get_played_count(media, &cnt); - media_info_destroy(media); - IF_FAIL_VOID_TAG(cnt >= 0, _E, "Invalid play count"); - - MediaContentMonitor *instance = static_cast(userData); - instance->__updatePlayCount(uuid, - (mediaType == MEDIA_CONTENT_TYPE_MUSIC) ? MEDIA_TYPE_MUSIC : MEDIA_TYPE_VIDEO, - cnt); -} - -void ctx::MediaContentMonitor::__appendCleanupQuery(std::stringstream &query) -{ - int timestamp = static_cast(time(NULL)); - IF_FAIL_VOID(timestamp - __lastCleanupTime >= ONE_DAY_IN_SEC); - - __lastCleanupTime = timestamp; - - query << - "DELETE FROM Log_MediaPlayCount WHERE UTC < strftime('%s', 'now') - " << PLAYCOUNT_RETENTION_PERIOD << ";" \ - "DELETE FROM " MEDIA_TABLE_NAME " WHERE UTC < strftime('%s', 'now') - " << LOG_RETENTION_PERIOD << ";"; -} - -void ctx::MediaContentMonitor::__updatePlayCount(const char *uuid, int type, int count) -{ - std::stringstream query; - query << - /* Inserting the media record to the play count table, if not exist */ - "INSERT OR IGNORE INTO Log_MediaPlayCount" \ - " (UUID, MediaType) VALUES ('" << uuid << "'," << type <<");" \ - /* Updating the play count and getting the diff from the previous count */ - "UPDATE Log_MediaPlayCount SET Diff = " << count << " - Count," \ - " Count = " << count << ", UTC = strftime('%s', 'now')" \ - " WHERE UUID = '" << uuid << "';"; - __appendCleanupQuery(query); - query << - /* Checking whether the play count changes */ - "SELECT MediaType FROM Log_MediaPlayCount" \ - " WHERE UUID = '" << uuid << "' AND Diff > 0;"; - - __dbManager.execute(0, query.str().c_str(), this); -} - -void ctx::MediaContentMonitor::onExecuted(unsigned int queryId, int error, std::vector& records) -{ - IF_FAIL_VOID(!records.empty()); - - int mediaType = 0; - records[0].get(NULL, CX_MEDIA_TYPE, &mediaType); - - __insertLog(mediaType); -} - -void ctx::MediaContentMonitor::__insertLog(int mediaType) -{ - int systemVolume = -1, mediaVolume = -1, audioJack = -1; - - Json data; - data.set(NULL, CX_MEDIA_TYPE, mediaType); - - if (ctx::system_info::getAudioJackState(&audioJack)) - data.set(NULL, STATS_AUDIO_JACK, audioJack); - - if (ctx::system_info::getVolume(&systemVolume, &mediaVolume)) { - data.set(NULL, STATS_SYSTEM_VOLUME, systemVolume); - data.set(NULL, STATS_MEDIA_VOLUME, mediaVolume); - } - - __dbManager.insert(0, MEDIA_TABLE_NAME, data, NULL); -} diff --git a/src/statistics/media/MediaContentMonitor.h b/src/statistics/media/MediaContentMonitor.h deleted file mode 100644 index b8709aa..0000000 --- a/src/statistics/media/MediaContentMonitor.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_MEDIA_CONTENT_MONITOR_H_ -#define _CONTEXT_STATS_MEDIA_CONTENT_MONITOR_H_ - -#include -#include -#include - -namespace ctx { - - class MediaContentMonitor : public IDatabaseListener { - private: - bool __started; - int __lastCleanupTime; - DatabaseManager __dbManager; - - bool __startMonitoring(); - void __stopMonitoring(); - - void __appendCleanupQuery(std::stringstream &query); - void __updatePlayCount(const char *uuid, int type, int count); - void __insertLog(int mediaType); - - void onTableCreated(unsigned int queryId, int error) {} - void onInserted(unsigned int queryId, int error, int64_t rowId) {} - void onExecuted(unsigned int queryId, int error, std::vector& records); - - static void __onMediaContentDbUpdated(media_content_error_e error, int pid, - media_content_db_update_item_type_e updateItem, - media_content_db_update_type_e updateType, - media_content_type_e mediaType, - char *uuid, char *path, char *mimeType, void *userData); - - public: - MediaContentMonitor(); - ~MediaContentMonitor(); - }; - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_STATS_MEDIA_CONTENT_MONITOR_H_ */ diff --git a/src/statistics/media/MediaStatisticsTypes.h b/src/statistics/media/MediaStatisticsTypes.h deleted file mode 100644 index a71e553..0000000 --- a/src/statistics/media/MediaStatisticsTypes.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_MEDIA_TYPES_H_ -#define _CONTEXT_STATS_MEDIA_TYPES_H_ - -#include "../shared/CommonTypes.h" - -#define MEDIA_HISTORY_PRIV "mediahistory.read" -#define MEDIA_SUBJ_LOGGER "stats/media/logger" -#define MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC "stats/music/peak_time" -#define MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO "stats/video/peak_time" -#define MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC "stats/music/setting" -#define MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO "stats/video/setting" -#define MEDIA_SUBJ_MUSIC_FREQUENCY "stats/music/frequency" -#define MEDIA_SUBJ_VIDEO_FREQUENCY "stats/video/frequency" - -#define MEDIA_TABLE_NAME "Log_MediaPlayback" -#define MEDIA_TABLE_COLUMNS \ - "MediaType INTEGER NOT NULL, " \ - "SystemVolume INTEGER, MediaVolume INTEGER, AudioJack INTEGER, " \ - "UTC TIMESTAMP DEFAULT (strftime('%s', 'now')), " \ - "LocalTime TIMESTAMP DEFAULT (strftime('%s', 'now', 'localtime'))" - -#define MEDIA_PLAYCOUNT_TABLE_SCHEMA \ - "CREATE TABLE IF NOT EXISTS Log_MediaPlayCount" \ - " (UUID TEXT NOT NULL PRIMARY KEY, MediaType INTEGER NOT NULL," \ - " Count INTEGER DEFAULT 0, Diff INTEGER DEFAULT 0, " \ - " UTC TIMESTAMP DEFAULT (strftime('%s', 'now')))" - -#define CX_MEDIA_TYPE "MediaType" - -enum mediaType_e { - MEDIA_TYPE_MUSIC = 1, - MEDIA_TYPE_VIDEO, -}; - -#endif /* End of _CONTEXT_STATS_MEDIA_TYPES_H_ */ diff --git a/src/statistics/media/MediaStatsLogger.cpp b/src/statistics/media/MediaStatsLogger.cpp deleted file mode 100644 index 9b1db7d..0000000 --- a/src/statistics/media/MediaStatsLogger.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "MediaStatisticsTypes.h" -#include "MediaStatsLogger.h" - -using namespace ctx; - -MediaStatsLogger::MediaStatsLogger() : - ContextProvider(MEDIA_SUBJ_LOGGER) -{ -} - -MediaStatsLogger::~MediaStatsLogger() -{ -} - -int MediaStatsLogger::subscribe(Json option, Json* requestResult) -{ - return ERR_NONE; -} - -int MediaStatsLogger::unsubscribe(Json option) -{ - return ERR_NONE; -} diff --git a/src/statistics/media/MediaStatsLogger.h b/src/statistics/media/MediaStatsLogger.h deleted file mode 100644 index 28e8aca..0000000 --- a/src/statistics/media/MediaStatsLogger.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_MEDIA_STATS_LOGGER_H_ -#define _CONTEXT_MEDIA_STATS_LOGGER_H_ - -#include -#include "MediaContentMonitor.h" - -namespace ctx { - - class MediaStatsLogger : public ContextProvider { - public: - MediaStatsLogger(); - ~MediaStatsLogger(); - - int subscribe(Json option, Json *requestResult); - int unsubscribe(Json option); - - void submitTriggerItem() {} - - private: - MediaContentMonitor __contentMon; - }; - -} /* namespace ctx */ - -#endif /* _CONTEXT_MEDIA_STATS_LOGGER_H_ */ - diff --git a/src/statistics/media/MediaStatsProvider.cpp b/src/statistics/media/MediaStatsProvider.cpp deleted file mode 100644 index b8ce482..0000000 --- a/src/statistics/media/MediaStatsProvider.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "MediaStatsProvider.h" -#include "DbHandle.h" - -using namespace ctx; - -MediaStatsProvider::MediaStatsProvider(const char *subject) : - ContextProvider(subject) -{ -} - -MediaStatsProvider::~MediaStatsProvider() -{ -} - -bool MediaStatsProvider::isSupported() -{ - /* TODO */ - return true; -} - -void MediaStatsProvider::submitTriggerItem() -{ -} - -int MediaStatsProvider::read(Json option, Json* requestResult) -{ - MediaDbHandle *handle = new(std::nothrow) MediaDbHandle(this); - IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); - - int err = handle->read(option); - if (err != ERR_NONE) { - delete handle; - return err; - } - - return ERR_NONE; -} - -void MusicFreqProvider::submitTriggerItem() -{ - registerTriggerItem(OPS_READ, - "{" TRIG_DEF_TOTAL_COUNT "}", - "{" TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK "}"); -} - -void VideoFreqProvider::submitTriggerItem() -{ - registerTriggerItem(OPS_READ, - "{" TRIG_DEF_TOTAL_COUNT "}", - "{" TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK "}"); -} diff --git a/src/statistics/media/MediaStatsProvider.h b/src/statistics/media/MediaStatsProvider.h deleted file mode 100644 index 5895c46..0000000 --- a/src/statistics/media/MediaStatsProvider.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_MEDIA_STATS_PROVIDER_H_ -#define _CONTEXT_MEDIA_STATS_PROVIDER_H_ - -#include -#include "MediaStatisticsTypes.h" - -namespace ctx { - - class MediaStatsProvider : public ContextProvider { - public: - int read(Json option, Json* requestResult); - - bool isSupported(); - virtual void submitTriggerItem(); - - protected: - MediaStatsProvider(const char *subject); - virtual ~MediaStatsProvider(); - }; /* class MediaStatsProvider */ - - - class MusicPeakTimeProvider : public MediaStatsProvider { - public: - MusicPeakTimeProvider() : - MediaStatsProvider(MEDIA_SUBJ_PEAK_TIME_FOR_MUSIC) {} - }; - - - class VideoPeakTimeProvider : public MediaStatsProvider { - public: - VideoPeakTimeProvider() : - MediaStatsProvider(MEDIA_SUBJ_PEAK_TIME_FOR_VIDEO) {} - }; - - - class MusicSettingProvider: public MediaStatsProvider { - public: - MusicSettingProvider() : - MediaStatsProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_MUSIC) {} - }; - - - class VideoSettingProvider: public MediaStatsProvider { - public: - VideoSettingProvider() : - MediaStatsProvider(MEDIA_SUBJ_COMMON_SETTING_FOR_VIDEO) {} - }; - - - class MusicFreqProvider: public MediaStatsProvider { - public: - MusicFreqProvider() : - MediaStatsProvider(MEDIA_SUBJ_MUSIC_FREQUENCY) {} - - void submitTriggerItem(); - }; - - - class VideoFreqProvider: public MediaStatsProvider { - public: - VideoFreqProvider() : - MediaStatsProvider(MEDIA_SUBJ_VIDEO_FREQUENCY) {} - - void submitTriggerItem(); - }; - -} /* namespace ctx */ - -#endif /* _CONTEXT_MEDIA_STATS_PROVIDER_H_ */ diff --git a/src/statistics/prediction/assoc_rule.cpp b/src/statistics/prediction/assoc_rule.cpp deleted file mode 100644 index 05be246..0000000 --- a/src/statistics/prediction/assoc_rule.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "assoc_rule.h" - -std::ostream& ctx::operator<<(std::ostream &out, const ctx::AssocRule &rule) -{ - return out << rule.antecedent << " => " << rule.consequent - << "; support:" << rule.support << "; confidence:" << rule.confidence; -} - -bool ctx::operator==(const ctx::AssocRule& left, const ctx::AssocRule& right) -{ - return left.antecedent == right.antecedent && - left.consequent == right.consequent && - left.support == right.support && - left.confidence == right.confidence; -} diff --git a/src/statistics/prediction/assoc_rule.h b/src/statistics/prediction/assoc_rule.h deleted file mode 100644 index 20d195d..0000000 --- a/src/statistics/prediction/assoc_rule.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_H_ -#define _PREDICTION_ASSOC_RULE_H_ - -#include "item_set.h" -#include - -namespace ctx { - - struct AssocRule { - ItemSet antecedent; - ItemSet consequent; - double support; - double confidence; - - AssocRule(const ItemSet& antecedent_, - const ItemSet& consequent_, - const double& support_, - const double& confidence_) - : antecedent(antecedent_) - , consequent(consequent_) - , support(support_) - , confidence(confidence_) {} - }; - - bool operator==(const AssocRule& left, const AssocRule& right); - - std::ostream& operator<<(std::ostream &out, const AssocRule &rule); - -} /* namespace ctx */ - -#endif /* _PREDICTION_ASSOC_RULE_H_ */ diff --git a/src/statistics/prediction/assoc_rule_miner.cpp b/src/statistics/prediction/assoc_rule_miner.cpp deleted file mode 100644 index a639af8..0000000 --- a/src/statistics/prediction/assoc_rule_miner.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "assoc_rule_miner.h" -#include "single_category_item_id_filter.h" -#include "basket_filter.h" -#include "basket_compressor.h" -#include "baskets_agregator.h" -#include "assoc_rule_producer.h" -#include "weight_apriori.h" - -std::list ctx::AssocRuleMiner::mine_from_baskets( - std::list& initBaskets, - ctx::ItemCatalogue& itemCatalogue, - double minSupport, - double minConfidence, - std::string consequentCategory) -{ - SingleCategoryItemIdFilter itemIdFilter(consequentCategory, itemCatalogue); - BasketFilter::filter_in_place(initBaskets,itemIdFilter); - - std::list compressedBaskets = BasketCompressor::compress(initBaskets); - - BasketsAgregator basketsAgregator(compressedBaskets); - basketsAgregator.generate_bitsets(itemCatalogue.maxId()); - auto freqItemSets = WeightApriori::find_frequent_itemid_sets(basketsAgregator, minSupport); - auto rulesOfIds = AssocRuleProducer::generate_rules(freqItemSets, itemIdFilter, minConfidence); - return remove_assoc_rule_ids(rulesOfIds, itemCatalogue); -} - -std::list ctx::AssocRuleMiner::mine_from_events( - const ctx::EventSet& events, - double minSupport, - double minConfidence, - std::string consequentCategory) -{ - ItemCatalogue itemCatalogue; - - BasketProducer basketProducer(itemCatalogue); - for (auto& event : events) { - basketProducer.put_event(event); - } - - std::list initBaskets = basketProducer.make_baskets(); - - return mine_from_baskets(initBaskets, itemCatalogue, minSupport, minConfidence, consequentCategory); -} - -std::list ctx::AssocRuleMiner::remove_assoc_rule_ids( - const std::list& rulesOfIds, - const ctx::ItemCatalogue& itemCatalogue) -{ - std::list result; - for (const AssocRuleOfIds ruleOfIds : rulesOfIds) { - AssocRule rule(remove_assoc_rule_ids(ruleOfIds.antecedent, itemCatalogue), - remove_assoc_rule_ids(ruleOfIds.consequent, itemCatalogue), - ruleOfIds.support, - ruleOfIds.confidence); - result.push_back(rule); - } - return result; -} - -ctx::ItemSet ctx::AssocRuleMiner::remove_assoc_rule_ids(const ctx::ItemIdSet& itemIdSet, const ctx::ItemCatalogue& itemCatalogue) -{ - ItemSet itemSet; - for (int id : itemIdSet) { - itemSet.push_back(itemCatalogue.item_of_id(id)); - } - return itemSet; -} diff --git a/src/statistics/prediction/assoc_rule_miner.h b/src/statistics/prediction/assoc_rule_miner.h deleted file mode 100644 index a9c9e97..0000000 --- a/src/statistics/prediction/assoc_rule_miner.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_MINER_H_ -#define _PREDICTION_ASSOC_RULE_MINER_H_ - -#include -#include -#include "event_set.h" -#include "assoc_rule.h" -#include "assoc_rule_of_ids.h" -#include "basket_producer.h" -#include "i_item_id_filter.h" - -namespace ctx { - - class AssocRuleMiner { - - public: - static std::list mine_from_events( - const EventSet& events, - double minSupport, - double minConfidence, - std::string consequentCategory); - static std::list mine_from_baskets( - std::list& initBaskets, - ItemCatalogue& itemCatalogue, - double minSupport, - double minConfidence, - std::string consequentCategory); - private: - static std::list remove_assoc_rule_ids(const std::list& rulesOfIds, const ItemCatalogue& itemCatalogue); - static ItemSet remove_assoc_rule_ids(const ItemIdSet& itemIdSet, const ItemCatalogue& itemCatalogue); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_ASSOC_RULE_MINER_H_ */ diff --git a/src/statistics/prediction/assoc_rule_of_ids.h b/src/statistics/prediction/assoc_rule_of_ids.h deleted file mode 100644 index 9597a55..0000000 --- a/src/statistics/prediction/assoc_rule_of_ids.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_OF_IDS_H_ -#define _PREDICTION_ASSOC_RULE_OF_IDS_H_ - -#include "item_id_set.h" - -namespace ctx { - - /* rule of the form antecedent => consequent */ - class AssocRuleOfIds { - - public: - ItemIdSet antecedent; - ItemIdSet consequent; - double support; - double confidence; - }; - - inline bool operator==(const AssocRuleOfIds& left, const AssocRuleOfIds& right) - { - return left.support == right.support - && left.confidence == right.confidence - && left.antecedent == right.antecedent - && left.consequent == right.consequent; - } - -} /* namespace ctx */ - -#endif /* _PREDICTION_ASSOC_RULE_OF_IDS_H_ */ diff --git a/src/statistics/prediction/assoc_rule_producer.cpp b/src/statistics/prediction/assoc_rule_producer.cpp deleted file mode 100644 index da9f5d2..0000000 --- a/src/statistics/prediction/assoc_rule_producer.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "assoc_rule_producer.h" - -ctx::AssocRuleOfIds ctx::AssocRuleProducer::rule_template(const ctx::ItemIdSet& sourceItemIdSet, - const ctx::IItemIdFilter& itemIdFilter) -{ - AssocRuleOfIds ruleTempl; - for (int itemId : sourceItemIdSet) { - ItemIdSet &destination = itemIdFilter.pass(itemId) - ? ruleTempl.consequent - : ruleTempl.antecedent; - destination.push_back(itemId); - } - return ruleTempl; -} - -std::list ctx::AssocRuleProducer::generate_rules( - const std::list>& freqItemIdSets, - const ctx::IItemIdFilter& itemIdFilter, double minConfidence) -{ - std::list rules; - - for (auto & pair : freqItemIdSets) { - ItemIdSet freqItemIdSet = pair.first; - double support = pair.second; - AssocRuleOfIds rule = AssocRuleProducer::rule_template(freqItemIdSet, itemIdFilter); - if (rule.antecedent.size() > 0 && rule.consequent.size() > 0) { - rule.support = support; - double antecedentSupport = AssocRuleProducer::supportOf(freqItemIdSets, rule.antecedent); - rule.confidence = support / antecedentSupport; - if (rule.confidence >= minConfidence) { - rules.push_back(rule); - } - } - } - return rules; -} - -double ctx::AssocRuleProducer::supportOf( - const std::list> &allFreqItemIdSets, const ctx::ItemIdSet &wanted) -{ - for (auto & pair : allFreqItemIdSets) { - if (pair.first == wanted) { - return pair.second; - } - } - return 0.0; -} diff --git a/src/statistics/prediction/assoc_rule_producer.h b/src/statistics/prediction/assoc_rule_producer.h deleted file mode 100644 index 2b02b79..0000000 --- a/src/statistics/prediction/assoc_rule_producer.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ASSOC_RULE_PRODUCER_H_ -#define _PREDICTION_ASSOC_RULE_PRODUCER_H_ - -#include "assoc_rule_of_ids.h" -#include "basket.h" -#include "i_item_id_filter.h" -#include - -namespace ctx { - - class AssocRuleProducer { - - public: - static std::list generate_rules( - const std::list> &freqItemIdSets, - const IItemIdFilter &itemIdFilter, - double minConfidence); - - static AssocRuleOfIds rule_template(const ItemIdSet &sourceItemIdSet, const IItemIdFilter &antecedentItemIdFilter); - - private: - static double supportOf(const std::list> &allFreqItemIdSets, const ItemIdSet &wanted); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_ASSOC_RULE_PRODUCER_H_ */ diff --git a/src/statistics/prediction/basket.cpp b/src/statistics/prediction/basket.cpp deleted file mode 100644 index 35357ce..0000000 --- a/src/statistics/prediction/basket.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "basket.h" - -void ctx::Basket::compute_bitset(int maxId) -{ - mBitSet.resize(maxId+1, false); - for (int itemId : itemIdSet) { - mBitSet[itemId] = true; - } -} - -bool ctx::Basket::includes(const ctx::ItemIdSet& potentialSubset) -{ - for (int itemId : potentialSubset) { - if (!mBitSet[itemId]) { - return false; - } - } - return true; -} diff --git a/src/statistics/prediction/basket.h b/src/statistics/prediction/basket.h deleted file mode 100644 index 1adb851..0000000 --- a/src/statistics/prediction/basket.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_BASKET_H_ -#define _PREDICTION_BASKET_H_ - -#include "item_id_set.h" -#include - -namespace ctx { - - class Basket { - - public: - ItemIdSet itemIdSet; - int weight; - - Basket(const ItemIdSet& itemIdSet_, const int& weight_) : itemIdSet(itemIdSet_), weight(weight_) {}; - void compute_bitset(int maxId); - bool includes(const ItemIdSet& potentialSubset); // compute_bitset() should be invoked first - - private: - std::vector mBitSet; - - }; - - // TODO If there is no "inline" below the project does not compile. - inline bool operator==(const Basket& left, const Basket& right) - { - return left.weight == right.weight && left.itemIdSet == right.itemIdSet; - } - -} /* namespace ctx */ - -#endif /* _PREDICTION_BASKET_H_ */ diff --git a/src/statistics/prediction/basket_compressor.cpp b/src/statistics/prediction/basket_compressor.cpp deleted file mode 100644 index f46c40d..0000000 --- a/src/statistics/prediction/basket_compressor.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "basket_compressor.h" -#include -#include - -std::string ctx::BasketCompressor::itemset_string(const ctx::ItemIdSet& itemIdSet) -{ - std::stringstream ss; - for (int itemId : itemIdSet) { - ss << itemId << ','; - } - return ss.str(); -} - -std::list ctx::BasketCompressor::compress(const std::list& inputBaskets) -{ - std::map basketsMap; - // TODO: maybe it is worth to resign from string keys and use std::map instead. - - for (const Basket& basket : inputBaskets) { - std::string itemSetStr = itemset_string(basket.itemIdSet); - - auto findResult = basketsMap.find(itemSetStr); - if (findResult == basketsMap.end()) { - basketsMap.insert(std::pair(itemSetStr, basket)); - } else { - Basket& compressedBasket = findResult->second; - compressedBasket.weight += basket.weight; - } - } - - std::list compressedBaskets; - for (auto pair : basketsMap) { - compressedBaskets.push_back(pair.second); - } - return compressedBaskets; -} diff --git a/src/statistics/prediction/basket_compressor.h b/src/statistics/prediction/basket_compressor.h deleted file mode 100644 index 776f074..0000000 --- a/src/statistics/prediction/basket_compressor.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_BASKET_COMPRESSOR_H_ -#define _PREDICTION_BASKET_COMPRESSOR_H_ - -#include -#include -#include "basket.h" - -namespace ctx { - - class BasketCompressor { - - public: - static std::list compress(const std::list &inputBaskets); - - private: - static std::string itemset_string(const ItemIdSet &itemIdSet); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_BASKET_COMPRESSOR_H_ */ diff --git a/src/statistics/prediction/basket_filter.cpp b/src/statistics/prediction/basket_filter.cpp deleted file mode 100644 index da03b6c..0000000 --- a/src/statistics/prediction/basket_filter.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "basket_filter.h" - -void ctx::BasketFilter::filter_in_place(std::list& baskets, const ctx::IItemIdFilter& itemIdFilter) -{ - baskets.remove_if([&itemIdFilter] (Basket &basket) -> bool { return !BasketPass(basket, itemIdFilter); }); -} - -bool ctx::BasketFilter::BasketPass(const ctx::Basket& basket, const ctx::IItemIdFilter& itemIdFilter) -{ - for (int itemId : basket.itemIdSet) { - if (itemIdFilter.pass(itemId)) { - return true; - } - } - return false; -} diff --git a/src/statistics/prediction/basket_filter.h b/src/statistics/prediction/basket_filter.h deleted file mode 100644 index 6f8a114..0000000 --- a/src/statistics/prediction/basket_filter.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_BASKET_FILTER_H_ -#define _PREDICTION_BASKET_FILTER_H_ - -#include "basket.h" -#include "i_item_id_filter.h" -#include - -namespace ctx { - - class BasketFilter { - - public: - static void filter_in_place(std::list &inputBaskets, const IItemIdFilter &itemIdFilter); - - private: - static bool BasketPass(const Basket &basket, const IItemIdFilter &itemIdFilter); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_BASKET_FILTER_H_ */ diff --git a/src/statistics/prediction/basket_producer.cpp b/src/statistics/prediction/basket_producer.cpp deleted file mode 100644 index 99a3af9..0000000 --- a/src/statistics/prediction/basket_producer.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "basket_producer.h" -#include - -void ctx::BasketProducer::put_event(const ctx::Event& event) -{ - int iid = mItemCatalogue.id_of(event.item); - put_change(event.interval.start, iid); // positive value indicates start - put_change(event.interval.end, -iid); // negative value indicates end -} - -std::list ctx::BasketProducer::make_baskets() -{ - std::list baskets; - - time_t intervalStart; - std::set currentItemIds; - - bool first = true; - for (auto changePair : mChanges) { - if (first) { - first = false; - } else { - time_t intervalEnd = changePair.first; - int weight = intervalEnd - intervalStart; - ItemIdSet itemIdSet; - for (int itemId : currentItemIds) { - itemIdSet.push_back(itemId); - } - baskets.push_back(Basket(itemIdSet, weight)); - } - - for (int itemId : changePair.second) { - if (itemId > 0) { // item with itemId starts now - currentItemIds.insert(itemId); - } else { // item with -itemId ends now - currentItemIds.erase(-itemId); - } - } - - intervalStart = changePair.first; - } - - return baskets; -} - -void ctx::BasketProducer::put_change(time_t time, int value) -{ - if (mChanges.find(time) == mChanges.end()) { - mChanges[time] = std::list(); - } - mChanges[time].push_back(value); -} diff --git a/src/statistics/prediction/basket_producer.h b/src/statistics/prediction/basket_producer.h deleted file mode 100644 index f2c9757..0000000 --- a/src/statistics/prediction/basket_producer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_BASKET_PRODUCER_H_ -#define _PREDICTION_BASKET_PRODUCER_H_ - -#include "event.h" -#include "basket.h" -#include "item_catalogue.h" -#include - -namespace ctx { - - class BasketProducer { - - public: - BasketProducer(ItemCatalogue& itemCatalogue) : mItemCatalogue(itemCatalogue) {}; - void put_event(const Event& e); - std::list make_baskets(); - - private: - void put_change(time_t time, int value); - - ItemCatalogue& mItemCatalogue; - - /* - * Changes in timestamps. - * If an item starts than its id is stored. - * If an item ends than its negated id is stored. - */ - std::map> mChanges; - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_BASKET_PRODUCER_H_ */ diff --git a/src/statistics/prediction/baskets_agregator.cpp b/src/statistics/prediction/baskets_agregator.cpp deleted file mode 100644 index 7a57e9b..0000000 --- a/src/statistics/prediction/baskets_agregator.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "baskets_agregator.h" - -ctx::BasketsAgregator::BasketsAgregator(std::list& baskets) : mBaskets(baskets) -{ -} - -ctx::ItemIdSet ctx::BasketsAgregator::unique_item_ids() -{ - ItemIdSet allItemIds; - for (const Basket& basket : mBaskets) { - for (int itemId : basket.itemIdSet) { - allItemIds.push_back(itemId); - } - } - allItemIds.sort(); - allItemIds.unique(); - return allItemIds; -} - -void ctx::BasketsAgregator::generate_bitsets(int maxId) -{ - for (Basket& basket : mBaskets) { - basket.compute_bitset(maxId); - } -} - -double ctx::BasketsAgregator::supportOf(const ctx::ItemIdSet& itemIdSet) -{ - int matchedCount = 0; - int unmatchedCount = 0; - for (Basket& basket : mBaskets) { - if (basket.includes(itemIdSet)) { - matchedCount += basket.weight; - } else { - unmatchedCount += basket.weight; - } - } - return (double) matchedCount / (double) (matchedCount + unmatchedCount); -} diff --git a/src/statistics/prediction/baskets_agregator.h b/src/statistics/prediction/baskets_agregator.h deleted file mode 100644 index 5ce18c0..0000000 --- a/src/statistics/prediction/baskets_agregator.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_BASKETS_AGREGATOR_H_ -#define _PREDICTION_BASKETS_AGREGATOR_H_ - -#include -#include -#include "basket.h" - -namespace ctx { - - class BasketsAgregator { - - public: - BasketsAgregator(std::list& baskets); - void generate_bitsets(int maxId); - ItemIdSet unique_item_ids(); - double supportOf(const ItemIdSet &itemIdSet); - - private: - std::list& mBaskets; - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_BASKETS_AGREGATOR_H_ */ diff --git a/src/statistics/prediction/event.cpp b/src/statistics/prediction/event.cpp deleted file mode 100644 index 817e108..0000000 --- a/src/statistics/prediction/event.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "event.h" - -bool ctx::operator==(const ctx::Event& left, const ctx::Event& right) -{ - return left.item == right.item && left.interval == right.interval; -} - -bool ctx::operator!=(const ctx::Event& left, const ctx::Event& right) -{ - return !(left == right); -} diff --git a/src/statistics/prediction/event.h b/src/statistics/prediction/event.h deleted file mode 100644 index 99048e4..0000000 --- a/src/statistics/prediction/event.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_EVENT_H_ -#define _PREDICTION_EVENT_H_ - -#include "item.h" -#include "interval.h" - -namespace ctx { - - struct Event { - Item item; - Interval interval; - - /* long time event */ - Event(const Item& item_, const Interval& interval_) : item(item_), interval(interval_) {} - - /* instant event */ - Event(const Item& item_, const time_t& start_time_) : item(item_), interval(start_time_, start_time_ + 1) {} - }; - - bool operator==(const Event& left, const Event& right); - bool operator!=(const Event& left, const Event& right); - -} /* namespace ctx */ - -#endif /* _PREDICTION_EVENT_H_ */ diff --git a/src/statistics/prediction/event_set.h b/src/statistics/prediction/event_set.h deleted file mode 100644 index e097ece..0000000 --- a/src/statistics/prediction/event_set.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_EVENT_SET_H_ -#define _PREDICTION_EVENT_SET_H_ - -#include "event.h" - -namespace ctx { - - typedef std::list EventSet; - -} /* namespace ctx */ - -#endif /* _PREDICTION_EVENT_SET_H_ */ diff --git a/src/statistics/prediction/i_item_id_filter.h b/src/statistics/prediction/i_item_id_filter.h deleted file mode 100644 index 1a8ac45..0000000 --- a/src/statistics/prediction/i_item_id_filter.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_I_ITEM_ID_FILTER_H_ -#define _PREDICTION_I_ITEM_ID_FILTER_H_ - -namespace ctx { - - class IItemIdFilter { - - public: - virtual ~IItemIdFilter() {} - virtual bool pass(int itemId) const = 0; - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_I_ITEM_ID_FILTER_H_ */ diff --git a/src/statistics/prediction/interval.cpp b/src/statistics/prediction/interval.cpp deleted file mode 100644 index b6dc8f9..0000000 --- a/src/statistics/prediction/interval.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "interval.h" - -bool ctx::operator==(const Interval& left, const Interval& right) -{ - return left.start == right.start && left.end == right.end; -} - -bool ctx::operator!=(const Interval& left, const Interval& right) -{ - return !(left == right); -} diff --git a/src/statistics/prediction/interval.h b/src/statistics/prediction/interval.h deleted file mode 100644 index 3576da1..0000000 --- a/src/statistics/prediction/interval.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_INTERVAL_H_ -#define _PREDICTION_INTERVAL_H_ - -#include - -namespace ctx { - - struct Interval { - time_t start; - time_t end; - - Interval(time_t start_, time_t end_) : start(start_), end(end_) {} - }; - - bool operator==(const Interval& left, const Interval& right); - bool operator!=(const Interval& left, const Interval& right); - -} /* namespace ctx */ - -#endif /* _PREDICTION_INTERVAL_H_ */ diff --git a/src/statistics/prediction/item.cpp b/src/statistics/prediction/item.cpp deleted file mode 100644 index 9a80ca9..0000000 --- a/src/statistics/prediction/item.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "item.h" - -ctx::Item::Item(const std::string &s) -{ - size_t leftBracket = s.find('['); - size_t rightBracket = s.find(']', leftBracket); - category = s.substr(leftBracket + 1, rightBracket - 1); - value = s.substr(rightBracket + 1); - return; -} - -bool ctx::Item::operator==(const ctx::Item& other) const -{ - return other.category == category && other.value == value; -} - -bool ctx::Item::operator!=(const ctx::Item& other) const -{ - return !operator==(other); -} - -std::ostream& ctx::operator<<(std::ostream& out, const ctx::Item& item) -{ - return out << '[' << item.category << ']' << item.value; -} diff --git a/src/statistics/prediction/item.h b/src/statistics/prediction/item.h deleted file mode 100644 index 0e933ce..0000000 --- a/src/statistics/prediction/item.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ITEM_H_ -#define _PREDICTION_ITEM_H_ - -#include -#include - -namespace ctx { - - struct Item { - std::string category; - std::string value; - - Item(const std::string &category_, const std::string &value_) : category(category_), value(value_) {} - Item(const std::string &s); // in the form of "[Category]Value" - - bool operator==(const Item& other) const; - bool operator!=(const Item& other) const; - }; - - std::ostream& operator<<(std::ostream& out, const Item& item); - -} /* namespace ctx */ - -namespace std { - - template <> struct hash { - size_t operator()(const ctx::Item &item) const { - hash hasher; - return hasher(item.category + ":" + item.value); - } - }; - -} - -#endif /* _PREDICTION_ITEM_H_ */ diff --git a/src/statistics/prediction/item_catalogue.cpp b/src/statistics/prediction/item_catalogue.cpp deleted file mode 100644 index 666b5a8..0000000 --- a/src/statistics/prediction/item_catalogue.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "item_catalogue.h" -#include "item_string_converter.h" - -int ctx::ItemCatalogue::id_of(const ctx::Item& item) -{ - std::string s = ItemStringConverter::item_to_string(item); - std::map::iterator it = mItemIdsOfStrings.find(s); - if (it == mItemIdsOfStrings.end()) { // new item - mMaxId++; - mItemIdsOfStrings[s] = mMaxId; - mItemStrings.push_back(s); - extendCategoryItemIds(item.category, mMaxId); - return mMaxId; - } else { // existing item - return mItemIdsOfStrings[s]; - } -} - -bool ctx::ItemCatalogue::exists_item_of_id(int id) const -{ - return id > 0 && id <= mMaxId; -} - -ctx::Item ctx::ItemCatalogue::item_of_id(int id) const -{ - return ItemStringConverter::string_to_item(mItemStrings[id]); -} - -std::set ctx::ItemCatalogue::category_item_ids(std::string category) const -{ - auto it = mCategoryItemIds.find(category); - if (it == mCategoryItemIds.end()) { - return std::set(); - } else { - return it->second; - } -} - -void ctx::ItemCatalogue::extendCategoryItemIds(std::string category, int itemId) -{ - if (mCategoryItemIds.find(category) == mCategoryItemIds.end()) { - mCategoryItemIds[category] = std::set(); - } - mCategoryItemIds[category].insert(itemId); -} diff --git a/src/statistics/prediction/item_catalogue.h b/src/statistics/prediction/item_catalogue.h deleted file mode 100644 index 404765b..0000000 --- a/src/statistics/prediction/item_catalogue.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ITEM_CATALOGUE_H_ -#define _PREDICTION_ITEM_CATALOGUE_H_ - -#include "item.h" -#include -#include -#include - -namespace ctx { - - class ItemCatalogue { - - public: - ItemCatalogue() : mMaxId(0) { - mItemStrings.push_back(std::string("")); - } - - int id_of(Item const &item); - - bool exists_item_of_id(int id) const; - Item item_of_id(int id) const; - std::set category_item_ids(std::string category) const; - int maxId() const {return mMaxId;}; - - private: - /* Translates item string to its id */ - std::map mItemIdsOfStrings; - - /* Translating category string to int */ - std::map> mCategoryItemIds; - - /* Stores item strings (index is item's id) */ - std::vector mItemStrings; - - /* Preserves maximal item's id */ - int mMaxId; - - void extendCategoryItemIds(std::string category, int itemId); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_ITEM_CATALOGUE_H_ */ diff --git a/src/statistics/prediction/item_id_set.h b/src/statistics/prediction/item_id_set.h deleted file mode 100644 index ce18f71..0000000 --- a/src/statistics/prediction/item_id_set.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ITEM_ID_SET_H_ -#define _PREDICTION_ITEM_ID_SET_H_ - -#include - -namespace ctx { - - /* A set storing item ids */ - typedef std::list ItemIdSet; - -} /* namespace ctx */ - -#endif /* _PREDICTION_ITEM_ID_SET_H_ */ diff --git a/src/statistics/prediction/item_set.cpp b/src/statistics/prediction/item_set.cpp deleted file mode 100644 index dccee66..0000000 --- a/src/statistics/prediction/item_set.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "item_set.h" -#include - -std::ostream& ctx::operator<<(std::ostream& out, const ctx::ItemSet& itemSet) -{ - bool first = true; - for (auto& item : itemSet) { - if (first) { - first = false; - } else { - out << ", "; - } - out << item; - } - return out; -} - -bool ctx::itemset_includes_in(const ctx::ItemSet& small, const ctx::ItemSet& big) -{ - for (const Item& s : small) { - if (std::find(big.begin(), big.end(), s) == big.end()) - return false; - } - return true; -} diff --git a/src/statistics/prediction/item_set.h b/src/statistics/prediction/item_set.h deleted file mode 100644 index f13c8bc..0000000 --- a/src/statistics/prediction/item_set.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ITEM_SET_H_ -#define _PREDICTION_ITEM_SET_H_ - -#include -#include "item.h" - -namespace ctx { - - /* A set storing item ids */ - typedef std::list ItemSet; - - std::ostream& operator<<(std::ostream& out, const ItemSet& itemSet); - - bool itemset_includes_in(const ItemSet& small, const ItemSet& big); - -} /* namespace ctx */ - -#endif /* _PREDICTION_ITEM_SET_H_ */ diff --git a/src/statistics/prediction/item_string_converter.cpp b/src/statistics/prediction/item_string_converter.cpp deleted file mode 100644 index 399847a..0000000 --- a/src/statistics/prediction/item_string_converter.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "item_string_converter.h" -#include - -std::string ctx::ItemStringConverter::item_to_string(const ctx::Item &item) -{ - return item.category + SEPARATOR + item.value; -} - -ctx::Item ctx::ItemStringConverter::string_to_item(const std::string& s) -{ - size_t pos = s.find(SEPARATOR); - //assert(pos != std::string::npos); - return Item(s.substr(0, pos), s.substr(pos + 1)); -} diff --git a/src/statistics/prediction/item_string_converter.h b/src/statistics/prediction/item_string_converter.h deleted file mode 100644 index 15de8b2..0000000 --- a/src/statistics/prediction/item_string_converter.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_ITEM_STRING_CONVERTER_H_ -#define _PREDICTION_ITEM_STRING_CONVERTER_H_ - -#include "item.h" - -namespace ctx { - - class ItemStringConverter { - - public: - static const char SEPARATOR = ':'; - static std::string item_to_string(const Item &item); - static Item string_to_item(const std::string& s); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_ITEM_STRING_CONVERTER_H_ */ diff --git a/src/statistics/prediction/single_category_item_id_filter.cpp b/src/statistics/prediction/single_category_item_id_filter.cpp deleted file mode 100644 index 6646e8d..0000000 --- a/src/statistics/prediction/single_category_item_id_filter.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "single_category_item_id_filter.h" - -ctx::SingleCategoryItemIdFilter::SingleCategoryItemIdFilter(std::string category, const ctx::ItemCatalogue &itemCatalogue) -{ - mAcceptedItemIds = itemCatalogue.category_item_ids(category); -} - -bool ctx::SingleCategoryItemIdFilter::pass(int itemId) const -{ - return mAcceptedItemIds.find(itemId) != mAcceptedItemIds.end(); -} diff --git a/src/statistics/prediction/single_category_item_id_filter.h b/src/statistics/prediction/single_category_item_id_filter.h deleted file mode 100644 index 4cc7dd6..0000000 --- a/src/statistics/prediction/single_category_item_id_filter.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_SINGLE_CATEGORY_ITEM_ID_FILTER_H_ -#define _PREDICTION_SINGLE_CATEGORY_ITEM_ID_FILTER_H_ - -#include "i_item_id_filter.h" -#include "item_catalogue.h" - -namespace ctx { - - class SingleCategoryItemIdFilter : public IItemIdFilter { - - public: - SingleCategoryItemIdFilter(std::string category, const ItemCatalogue& itemCatalogue); - bool pass(int itemId) const override; - - private: - std::set mAcceptedItemIds; - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_SINGLE_CATEGORY_ITEM_ID_FILTER_H_ */ diff --git a/src/statistics/prediction/weight_apriori.cpp b/src/statistics/prediction/weight_apriori.cpp deleted file mode 100644 index 92aaebc..0000000 --- a/src/statistics/prediction/weight_apriori.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include "weight_apriori.h" -#include -#include - -std::list ctx::WeightApriori::find_wider_candidates(const std::list &narrowFreqSets, int widerSize) -{ - std::list candidates; - for (auto iter1 = narrowFreqSets.begin(); iter1 != narrowFreqSets.end(); ++iter1) { - auto iter2 = iter1; ++iter2; - for (;iter2 != narrowFreqSets.end(); ++iter2) { - ItemIdSet itemIdSet1 = *iter1; - ItemIdSet itemIdSet2 = *iter2; - itemIdSet1.merge(itemIdSet2); - itemIdSet1.unique(); - if (int(itemIdSet1.size()) == widerSize) { - candidates.push_back(itemIdSet1); - } - } - } - candidates.sort(); - candidates.unique(); - return candidates; -} - -void ctx::WeightApriori::prune_wider_candidates(std::list& widerCandidates, const std::list& narrowFreqSets) -{ - std::list pruned; - for (auto iter = widerCandidates.begin(); iter != widerCandidates.end();) { - if (survives_prunning(*iter, narrowFreqSets)) { - ++iter; - } else { - iter = widerCandidates.erase(iter); - } - } -} - -bool ctx::WeightApriori::survives_prunning(ctx::ItemIdSet& widerCandidate, const std::list& narrowFreqSets) -{ - int removedItemId = widerCandidate.front(); - widerCandidate.pop_front(); - for (auto iter = widerCandidate.begin();; ++iter) { - if (std::find(narrowFreqSets.begin(), narrowFreqSets.end(), widerCandidate) == narrowFreqSets.end()) { - return false; // Caution: In this case the original contents of widerCandidate is not preserved. - } - if (iter == widerCandidate.end()) { - widerCandidate.push_back(removedItemId); // Restoring original contents of widerCandidate. - return true; - } - int newRemovedItemId = *iter; - *iter = removedItemId; - removedItemId = newRemovedItemId; - } -} - -std::list> ctx::WeightApriori::find_frequent_itemid_sets(ctx::BasketsAgregator &basketAgregator, double supportThreshold) -{ - std::list> allFreqItemsets; - std::list freqItemsetsOfCurrSize; - std::list candidates; - - int candidateSize = 1; - candidates = single_size_candidates(basketAgregator); - - while (!candidates.empty()) { - for (ItemIdSet candidate : candidates) { - double support = basketAgregator.supportOf(candidate); - if (support >= supportThreshold) { - freqItemsetsOfCurrSize.push_back(candidate); - allFreqItemsets.push_back(std::make_pair(candidate,support)); - } - } - candidates = find_wider_candidates(freqItemsetsOfCurrSize, ++candidateSize); - freqItemsetsOfCurrSize.clear(); - } - return allFreqItemsets; -} - -std::list ctx::WeightApriori::single_size_candidates(ctx::BasketsAgregator& basketAgregator) -{ - std::list candidates; - for (int itemId : basketAgregator.unique_item_ids()) { - candidates.push_back({itemId}); - } - return candidates; -} diff --git a/src/statistics/prediction/weight_apriori.h b/src/statistics/prediction/weight_apriori.h deleted file mode 100644 index 6cb493d..0000000 --- a/src/statistics/prediction/weight_apriori.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2015 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 _PREDICTION_WEIGHT_APRIORI_H_ -#define _PREDICTION_WEIGHT_APRIORI_H_ - -#include "baskets_agregator.h" -#include -#include - -namespace ctx { - - class WeightApriori { - - public: - static std::list find_wider_candidates(const std::list &narrowFreqSets, int widerSize); - static void prune_wider_candidates(std::list &widerCandidates, const std::list &narrowFreqSets); - - static bool survives_prunning(ItemIdSet &widerCandidate, const std::list &narrowFreqSets); - - /* Find frequent itemsets along with its support value. */ - static std::list> find_frequent_itemid_sets(BasketsAgregator &basketAgregator, double supportThreshold); - - private: - static std::list single_size_candidates(BasketsAgregator &basketAgregator); - - }; - -} /* namespace ctx */ - -#endif /* _PREDICTION_WEIGHT_APRIORI_H_ */ diff --git a/src/statistics/shared/CommonTypes.h b/src/statistics/shared/CommonTypes.h deleted file mode 100644 index d6673e1..0000000 --- a/src/statistics/shared/CommonTypes.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_COMMON_TYPES_H_ -#define _CONTEXT_STATS_COMMON_TYPES_H_ - -#define LOG_RETENTION_PERIOD 7776000 /* 90 days in secs */ - -#define DEFAULT_TIMESPAN 30 -#define DEFAULT_LIMIT 10 - -#define STATS_QUERY_RESULT "QueryResult" -#define STATS_RESULT_SIZE "ResultSize" -#define STATS_COL_ROW_ID "rowId" - -#define STATS_TIMESPAN "TimeSpan" -#define STATS_START_TIME "StartTime" -#define STATS_END_TIME "EndTime" -#define STATS_LAST_TIME "LastTime" -#define STATS_TOTAL_COUNT "TotalCount" -#define STATS_AVERAGE_COUNT "AvgCount" -#define STATS_DURATION "Duration" -#define STATS_TOTAL_DURATION "TotalDuration" -#define STATS_DAY_OF_WEEK "DayOfWeek" -#define STATS_HOUR_OF_DAY "HourOfDay" -#define STATS_TIME_OF_DAY "TimeOfDay" -#define STATS_TOTAL_COUNT "TotalCount" -#define STATS_APP_ID "AppId" -#define STATS_PKG_ID "PkgId" -#define STATS_AUDIO_JACK "AudioJack" -#define STATS_SYSTEM_VOLUME "SystemVolume" -#define STATS_MEDIA_VOLUME "MediaVolume" -#define STATS_BSSID "BSSID" -#define STATS_UNIV_TIME "UTC" -#define STATS_LOCAL_TIME "LocalTime" -#define STATS_RANK "Rank" - -#define STATS_SUN "Sun" -#define STATS_MON "Mon" -#define STATS_TUE "Tue" -#define STATS_WED "Wed" -#define STATS_THU "Thu" -#define STATS_FRI "Fri" -#define STATS_SAT "Sat" -#define STATS_WEEKDAY "Weekday" -#define STATS_WEEKEND "Weekend" - -enum StatsDayOfWeek_e { - STATS_DAY_OF_WEEK_WEEKDAY = 1, - STATS_DAY_OF_WEEK_WEEKEND, - STATS_DAY_OF_WEEK_ALL, - STATS_DAY_OF_WEEK_SUN, - STATS_DAY_OF_WEEK_MON, - STATS_DAY_OF_WEEK_TUE, - STATS_DAY_OF_WEEK_WED, - STATS_DAY_OF_WEEK_THU, - STATS_DAY_OF_WEEK_FRI, - STATS_DAY_OF_WEEK_SAT, -}; - -#define TRIG_DEF_RANK "\"Rank\":{\"type\":\"integer\",\"min\":1}" -#define TRIG_DEF_TOTAL_COUNT "\"TotalCount\":{\"type\":\"integer\",\"min\":0}" -#define TRIG_DEF_TIME_OF_DAY "\"TimeOfDay\":{\"type\":\"string\"}" -#define TRIG_DEF_DAY_OF_WEEK "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}" - -#endif /* End of _CONTEXT_STATS_COMMMON_TYPES_ */ diff --git a/src/statistics/shared/DbHandleBase.cpp b/src/statistics/shared/DbHandleBase.cpp deleted file mode 100644 index 979f75b..0000000 --- a/src/statistics/shared/DbHandleBase.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include "CommonTypes.h" -#include "DbHandleBase.h" - -#define DAY_OF_WEEK(SECOND) "CAST(strftime('%w', " SECOND ", 'unixepoch') AS INTEGER)" -#define HOUR_OF_DAY(SECOND) "CAST(strftime('%H', " SECOND ", 'unixepoch') AS INTEGER)" - -using namespace ctx; - -StatsDbHandleBase::StatsDbHandleBase(ContextProvider *provider) : - isTriggerItem(false), - reqProvider(provider) -{ -} - -StatsDbHandleBase::~StatsDbHandleBase() -{ -} - -int StatsDbHandleBase::generateQid() -{ - static int qid = 0; - - if (qid++ < 0) qid = 1; - return qid; -} - -bool StatsDbHandleBase::executeQuery(Json filter, const char* query) -{ - bool ret = __dbManager.execute(generateQid(), query, this); - IF_FAIL_RETURN(ret, false); - - reqFilter = filter; - - return true; -} - -std::string StatsDbHandleBase::createWhereClause(Json filter) -{ - std::stringstream whereClause; - int week = 0; - int start = 0; - int end = 0; - int timespan = DEFAULT_TIMESPAN; - std::string appId; - std::string weekStr; - std::string timeOfDay; - - if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) { - // In case of string (from Trigger) - if (weekStr == STATS_WEEKDAY) { - week = STATS_DAY_OF_WEEK_WEEKDAY; - - } else if (weekStr == STATS_WEEKEND) { - week = STATS_DAY_OF_WEEK_WEEKEND; - - } else if (weekStr == STATS_SUN) { - week = STATS_DAY_OF_WEEK_SUN; - - } else if (weekStr == STATS_MON) { - week = STATS_DAY_OF_WEEK_MON; - - } else if (weekStr == STATS_TUE) { - week = STATS_DAY_OF_WEEK_TUE; - - } else if (weekStr == STATS_WED) { - week = STATS_DAY_OF_WEEK_WED; - - } else if (weekStr == STATS_THU) { - week = STATS_DAY_OF_WEEK_THU; - - } else if (weekStr == STATS_FRI) { - week = STATS_DAY_OF_WEEK_FRI; - - } else if (weekStr == STATS_SAT) { - week = STATS_DAY_OF_WEEK_SAT; - } - } else { - // In case of integer (from History) - filter.get(NULL, STATS_DAY_OF_WEEK, &week); - } - - switch(week) { - case STATS_DAY_OF_WEEK_WEEKDAY: - whereClause << "(" DAY_OF_WEEK(STATS_LOCAL_TIME) " > 0 AND " DAY_OF_WEEK(STATS_LOCAL_TIME) " < 6) AND "; - break; - case STATS_DAY_OF_WEEK_WEEKEND: - whereClause << "(" DAY_OF_WEEK(STATS_LOCAL_TIME) " = 0 OR " DAY_OF_WEEK(STATS_LOCAL_TIME) " = 6) AND "; - break; - case STATS_DAY_OF_WEEK_SUN: - case STATS_DAY_OF_WEEK_MON: - case STATS_DAY_OF_WEEK_TUE: - case STATS_DAY_OF_WEEK_WED: - case STATS_DAY_OF_WEEK_THU: - case STATS_DAY_OF_WEEK_FRI: - case STATS_DAY_OF_WEEK_SAT: - whereClause << DAY_OF_WEEK(STATS_LOCAL_TIME) " = " << week - STATS_DAY_OF_WEEK_SUN << " AND "; - break; - default: - break; - } - - if (filter.get(NULL, STATS_APP_ID, &appId)) - whereClause << STATS_APP_ID " = '" << appId << "' AND "; - - if (filter.get(NULL, STATS_START_TIME, &start)) - whereClause << STATS_UNIV_TIME " >= " << start << " AND "; - - if (filter.get(NULL, STATS_END_TIME, &end)) - whereClause << STATS_UNIV_TIME " <= " << end << " AND "; - - if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) { - size_t pivot = timeOfDay.find('-'); - if (pivot != std::string::npos) { - std::string from = timeOfDay.substr(0, pivot); - std::string to = timeOfDay.substr(pivot + 1); - whereClause << "(" HOUR_OF_DAY(STATS_LOCAL_TIME) " >= " << from \ - << " AND " HOUR_OF_DAY(STATS_LOCAL_TIME) " < " << to << ") AND "; - } - } - - filter.get(NULL, STATS_TIMESPAN, ×pan); - whereClause << STATS_UNIV_TIME " > strftime('%s', 'now', '-" << timespan <<" day')"; - - return whereClause.str(); -} - -std::string StatsDbHandleBase::createSqlPeakTime(Json filter, const char* tableName, std::string whereClause) -{ - std::stringstream query; - int limit = DEFAULT_LIMIT; - - filter.get(NULL, STATS_RESULT_SIZE, &limit); - - query << - "SELECT " \ - HOUR_OF_DAY(STATS_LOCAL_TIME) " AS " STATS_HOUR_OF_DAY ", COUNT(*) AS " STATS_TOTAL_COUNT \ - " FROM " << tableName << \ - " WHERE " << whereClause << \ - " GROUP BY " HOUR_OF_DAY(STATS_LOCAL_TIME) \ - " ORDER BY " STATS_TOTAL_COUNT " DESC" \ - " LIMIT " << limit; - - return query.str(); -} - -std::string StatsDbHandleBase::createSqlCommonSetting(Json filter, const char* tableName, std::string whereClause) -{ - std::stringstream query; - - query << - "SELECT ( SELECT " STATS_AUDIO_JACK \ - " FROM " << tableName << \ - " WHERE " << whereClause << \ - " GROUP BY " STATS_AUDIO_JACK \ - " ORDER BY count(" STATS_AUDIO_JACK ") DESC" \ - " LIMIT 1 ) AS " STATS_AUDIO_JACK \ - ", ( SELECT " STATS_SYSTEM_VOLUME \ - " FROM " << tableName << \ - " WHERE " << whereClause << \ - " GROUP BY " STATS_SYSTEM_VOLUME \ - " ORDER BY count(" STATS_SYSTEM_VOLUME ") DESC" \ - " LIMIT 1 ) AS " STATS_SYSTEM_VOLUME \ - ", ( SELECT " STATS_MEDIA_VOLUME \ - " FROM " << tableName << \ - " WHERE " << whereClause << \ - " GROUP BY " STATS_MEDIA_VOLUME \ - " ORDER BY count(" STATS_MEDIA_VOLUME ") DESC" \ - " LIMIT 1 ) AS " STATS_MEDIA_VOLUME; - - return query.str(); -} - -void StatsDbHandleBase::onTableCreated(unsigned int queryId, int error) -{ -} - -void StatsDbHandleBase::onInserted(unsigned int queryId, int error, int64_t rowId) -{ - delete this; -} - -void StatsDbHandleBase::__jsonVectorToArray(std::vector &vecJson, Json &jsonResult) -{ - std::vector::iterator vecJsonEnd = vecJson.end(); - - for(auto vecJsonPos = vecJson.begin(); vecJsonPos != vecJsonEnd; ++vecJsonPos) { - Json originJson = *vecJsonPos; - jsonResult.append(NULL, STATS_QUERY_RESULT, originJson); - } -} - -void StatsDbHandleBase::onExecuted(unsigned int queryId, int error, std::vector& records) -{ - if (isTriggerItem) { - if (records.size() == 1) { - replyTriggerItem(error, records[0]); - } else { - _E("Invalid query result"); - Json dummy; - reqProvider->replyToRead(reqFilter, ERR_OPERATION_FAILED, dummy); - } - } else { - Json results = "{\"" STATS_QUERY_RESULT "\":[]}"; - __jsonVectorToArray(records, results); - reqProvider->replyToRead(reqFilter, error, results); - } - - delete this; -} diff --git a/src/statistics/shared/DbHandleBase.h b/src/statistics/shared/DbHandleBase.h deleted file mode 100644 index 8949550..0000000 --- a/src/statistics/shared/DbHandleBase.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_DB_HANDLE_BASE_H_ -#define _CONTEXT_STATS_DB_HANDLE_BASE_H_ - -#include -#include -#include - -namespace ctx { - class StatsDbHandleBase : public IDatabaseListener { - protected: - bool isTriggerItem; - ContextProvider *reqProvider; - Json reqFilter; - - StatsDbHandleBase(ContextProvider *provider); - ~StatsDbHandleBase(); - - std::string createWhereClause(Json filter); - std::string createSqlPeakTime(Json filter, const char* tableName, std::string whereClause); - std::string createSqlCommonSetting(Json filter, const char* tableName, std::string whereClause); - - bool executeQuery(Json filter, const char* query); - virtual void replyTriggerItem(int error, Json &jsonResult) = 0; - static int generateQid(); - - private: - void __jsonVectorToArray(std::vector &vecJson, Json &jsonResult); - - void onTableCreated(unsigned int queryId, int error); - void onInserted(unsigned int queryId, int error, int64_t rowId); - void onExecuted(unsigned int queryId, int error, std::vector& records); - - DatabaseManager __dbManager; - }; -} - -#endif /* End of _CONTEXT_STATS_DB_HANDLE_BASE_H_ */ diff --git a/src/statistics/shared/SystemInfo.cpp b/src/statistics/shared/SystemInfo.cpp deleted file mode 100644 index 63731f7..0000000 --- a/src/statistics/shared/SystemInfo.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include -#include -#include "SystemInfo.h" - -#define CONNECTED 1 -#define NOT_CONNECTED 0 - -using namespace ctx; - -bool system_info::getAudioJackState(int* state) -{ - int value = NOT_CONNECTED; - int err = runtime_info_get_value_int(RUNTIME_INFO_KEY_AUDIO_JACK_STATUS, &value); - IF_FAIL_RETURN(err == RUNTIME_INFO_ERROR_NONE, false); - - *state = (value == NOT_CONNECTED ? NOT_CONNECTED : CONNECTED); - - return true; -} - -bool system_info::getVolume(int* systemVolume, int* mediaVolume) -{ - int err; - - err = sound_manager_get_volume(SOUND_TYPE_SYSTEM, systemVolume); - IF_FAIL_RETURN(err == RUNTIME_INFO_ERROR_NONE, false); - - err = sound_manager_get_volume(SOUND_TYPE_MEDIA, mediaVolume); - IF_FAIL_RETURN(err == RUNTIME_INFO_ERROR_NONE, false); - - return true; -} - -bool system_info::getWifiBssid(std::string& bssid) -{ -#if 0 - /* NOTE: This routine does not work, because the wifi API does not support multi-sessions in one process */ - int err; - char *strBuf = NULL; - wifi_ap_h ap = NULL; - - err = wifi_initialize(); - IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _W, "wifi_initialize() failed (%d)", err); - - err = wifi_get_connected_ap(&ap); - if (err != WIFI_ERROR_NONE) { - _D("wifi_get_connected_ap() failed (%d)", err); - wifi_deinitialize(); - return false; - } - - wifi_ap_get_bssid(ap, &strBuf); - bssid = (strBuf != NULL ? strBuf : ""); - g_free(strBuf); - - wifi_ap_destroy(ap); - wifi_deinitialize(); - - return !bssid.empty(); -#endif - bssid = SharedVars().get(SharedVars::WIFI_BSSID); - return true; -} diff --git a/src/statistics/shared/SystemInfo.h b/src/statistics/shared/SystemInfo.h deleted file mode 100644 index 86f5b19..0000000 --- a/src/statistics/shared/SystemInfo.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_SYSTEM_INFO_READER_H_ -#define _CONTEXT_STATS_SYSTEM_INFO_READER_H_ - -#include - -namespace ctx { - namespace system_info { - bool getAudioJackState(int* state); - bool getVolume(int* systemVolume, int* mediaVolume); - bool getWifiBssid(std::string& bssid); - } -} - -#endif /* End of _CONTEXT_STATS_SYSTEM_INFO_READER_H_ */ diff --git a/src/statistics/social/DbHandle.cpp b/src/statistics/social/DbHandle.cpp deleted file mode 100644 index 5c1c0a6..0000000 --- a/src/statistics/social/DbHandle.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "SocialStatisticsTypes.h" -#include "DbHandle.h" - -using namespace ctx; - -SocialDbHandle::SocialDbHandle(ContextProvider *provider) : - StatsDbHandleBase(provider) -{ -} - -SocialDbHandle::~SocialDbHandle() -{ -} - -int SocialDbHandle::read(Json filter) -{ - std::string query; - const char *subject = reqProvider->getSubject(); - - if (STR_EQ(subject, SOCIAL_SUBJ_FREQ_ADDRESS)) { - query = createSqlFreqAddress(filter); - - } else if (STR_EQ(subject, SOCIAL_SUBJ_FREQUENCY)) { - isTriggerItem = true; - query = createSqlFrequency(filter); - } - - IF_FAIL_RETURN(!query.empty(), ERR_OPERATION_FAILED); - - bool ret = executeQuery(filter, query.c_str()); - IF_FAIL_RETURN(ret, ERR_OPERATION_FAILED); - - return ERR_NONE; -} - -std::string SocialDbHandle::createWhereClause(Json filter) -{ - std::stringstream whereClause; - int commType = -1; - - whereClause << StatsDbHandleBase::createWhereClause(filter); - - filter.get(NULL, SOCIAL_COMMUNICATION_TYPE, &commType); - - switch(commType) { - case SOCIAL_COMMUNICATION_TYPE_CALL: - whereClause << - " AND " SOCIAL_PHONE_LOG_TYPE " >= " << CONTACTS_PLOG_TYPE_VOICE_INCOMING << - " AND " SOCIAL_PHONE_LOG_TYPE " <= " << CONTACTS_PLOG_TYPE_VIDEO_BLOCKED; - break; - case SOCIAL_COMMUNICATION_TYPE_MESSAGE: - whereClause << - " AND " SOCIAL_PHONE_LOG_TYPE " >= " << CONTACTS_PLOG_TYPE_MMS_INCOMING << - " AND " SOCIAL_PHONE_LOG_TYPE " <= " << CONTACTS_PLOG_TYPE_MMS_BLOCKED; - break; - default: - break; - } - - return whereClause.str(); -} - -std::string SocialDbHandle::createSqlFreqAddress(Json filter) -{ - std::stringstream query; - int limit = DEFAULT_LIMIT; - - filter.get(NULL, STATS_RESULT_SIZE, &limit); - - query << - "SELECT " SOCIAL_ADDRESS ", " \ - "COUNT(*) AS " STATS_TOTAL_COUNT ", " \ - "SUM(" STATS_DURATION ") AS " STATS_TOTAL_DURATION ", " \ - "MAX(" STATS_UNIV_TIME ") AS " STATS_LAST_TIME \ - " FROM " SOCIAL_TABLE_CONTACT_LOG \ - " WHERE " << createWhereClause(filter) << - " GROUP BY " SOCIAL_ADDRESS \ - " ORDER BY COUNT(*) DESC" \ - " LIMIT " << limit; - - return query.str(); -} - -std::string SocialDbHandle::createSqlFrequency(Json filter) -{ - Json filterCleaned; - std::string weekStr; - std::string timeOfDay; - std::string address; - - if (!filter.get(NULL, SOCIAL_ADDRESS, &address)) { - _E("Invalid parameter"); - return ""; - } - - if (filter.get(NULL, STATS_DAY_OF_WEEK, &weekStr)) - filterCleaned.set(NULL, STATS_DAY_OF_WEEK, weekStr); - - if (filter.get(NULL, STATS_TIME_OF_DAY, &timeOfDay)) - filterCleaned.set(NULL, STATS_TIME_OF_DAY, timeOfDay); - - std::stringstream query; - - query << - "DELETE FROM " SOCIAL_TEMP_CONTACT_FREQ ";"; - - query << - "INSERT INTO " SOCIAL_TEMP_CONTACT_FREQ \ - " SELECT " SOCIAL_ADDRESS ", COUNT(*) AS " STATS_TOTAL_COUNT \ - " FROM " SOCIAL_TABLE_CONTACT_LOG \ - " WHERE " << createWhereClause(filterCleaned) << - " GROUP BY " SOCIAL_ADDRESS ";"; - - query << - "INSERT OR IGNORE INTO " SOCIAL_TEMP_CONTACT_FREQ " (" SOCIAL_ADDRESS ")" \ - " VALUES ('" << address << "');"; - - query << - "SELECT S." SOCIAL_ADDRESS ", S." STATS_TOTAL_COUNT ", 1+COUNT(lesser." STATS_TOTAL_COUNT ") AS " STATS_RANK \ - " FROM " SOCIAL_TEMP_CONTACT_FREQ " AS S" \ - " LEFT JOIN " SOCIAL_TEMP_CONTACT_FREQ " AS lesser" \ - " ON S." STATS_TOTAL_COUNT " < lesser." STATS_TOTAL_COUNT \ - " WHERE S." SOCIAL_ADDRESS " = '" << address << "'"; - - - return query.str(); -} - -void SocialDbHandle::replyTriggerItem(int error, Json &jsonResult) -{ - IF_FAIL_VOID_TAG(STR_EQ(reqProvider->getSubject(), SOCIAL_SUBJ_FREQUENCY), _E, "Invalid subject"); - - Json results; - std::string valStr; - int val; - - jsonResult.get(NULL, SOCIAL_ADDRESS, &valStr); - results.set(NULL, SOCIAL_ADDRESS, valStr); - jsonResult.get(NULL, STATS_TOTAL_COUNT, &val); - results.set(NULL, STATS_TOTAL_COUNT, val); - jsonResult.get(NULL, STATS_RANK, &val); - results.set(NULL, STATS_RANK, val); - - reqProvider->replyToRead(reqFilter, error, results); -} diff --git a/src/statistics/social/DbHandle.h b/src/statistics/social/DbHandle.h deleted file mode 100644 index 576c6a1..0000000 --- a/src/statistics/social/DbHandle.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_SOCIAL_DB_HANDLE_H_ -#define _CONTEXT_STATS_SOCIAL_DB_HANDLE_H_ - -#include -#include -#include "../shared/DbHandleBase.h" - -namespace ctx { - class SocialDbHandle : public StatsDbHandleBase { - public: - SocialDbHandle(ContextProvider *provider); - ~SocialDbHandle(); - - int read(Json filter); - - protected: - std::string createWhereClause(Json filter); - std::string createSqlFreqAddress(Json filter); - std::string createSqlFrequency(Json filter); - void replyTriggerItem(int error, Json &jsonResult); - }; -} - -#endif /* End of _CONTEXT_STATS_SOCIAL_DB_HANDLE_H_ */ diff --git a/src/statistics/social/LogAggregator.cpp b/src/statistics/social/LogAggregator.cpp deleted file mode 100644 index dac092d..0000000 --- a/src/statistics/social/LogAggregator.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2015 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. - */ - -#include -#include -#include -#include "SocialStatisticsTypes.h" -#include "LogAggregator.h" - -ctx::ContactLogAggregator::ContactLogAggregator() : - __timerId(-1), - __timeDiff(0) -{ - __createTable(); - __timerId = __timerManager.setAt(3, 0, DayOfWeek::EVERYDAY, this); -} - -ctx::ContactLogAggregator::~ContactLogAggregator() -{ - __timerManager.remove(__timerId); -} - -void ctx::ContactLogAggregator::__createTable() -{ - static bool done = false; - IF_FAIL_VOID(!done); - - __dbManager.createTable(0, SOCIAL_TABLE_CONTACT_LOG, SOCIAL_TABLE_CONTACT_LOG_COLUMNS, NULL, NULL); - __dbManager.execute(0, SOCIAL_TEMP_CONTACT_FREQ_SQL, NULL); - - done = true; -} - -bool ctx::ContactLogAggregator::onTimerExpired(int timerId) -{ - aggregateContactLog(); - return true; -} - -void ctx::ContactLogAggregator::aggregateContactLog() -{ - __dbManager.execute(0, - "SELECT IFNULL(MAX(" STATS_UNIV_TIME "),0) AS " STATS_LAST_TIME \ - ", (strftime('%s', 'now', 'localtime')) - (strftime('%s', 'now')) AS " TIME_DIFFERENCE \ - " FROM " SOCIAL_TABLE_CONTACT_LOG, this); -} - -void ctx::ContactLogAggregator::onExecuted(unsigned int queryId, int error, std::vector& records) -{ - IF_FAIL_VOID_TAG(!records.empty(), _E, "Invalid query result"); - - int lastTime = 0; - records[0].get(NULL, STATS_LAST_TIME, &lastTime); - records[0].get(NULL, TIME_DIFFERENCE, &__timeDiff); - - _D("Last Time: %d / Local - UTC: %d", lastTime, __timeDiff); - - contacts_list_h list = NULL; - - __getUpdatedContactLogList(lastTime, &list); - IF_FAIL_VOID(list); - - __removeExpiredLog(); - __insertContactLogList(list); - __destroyContactLogList(list); -} - -void ctx::ContactLogAggregator::__getUpdatedContactLogList(int lastTime, contacts_list_h *list) -{ - contacts_filter_h filter = NULL; - contacts_query_h query = NULL; - - int err = contacts_connect(); - IF_FAIL_VOID_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_connect() failed"); - - err = contacts_filter_create(_contacts_phone_log._uri, &filter); - IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_filter_create() failed"); - - contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_VOICE_INCOMING); - contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); - contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_LESS_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_MMS_BLOCKED); - contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); - contacts_filter_add_int(filter, _contacts_phone_log.log_time , CONTACTS_MATCH_GREATER_THAN, lastTime); - contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); - - err = contacts_query_create(_contacts_phone_log._uri, &query); - IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_query_create() failed"); - - contacts_query_set_filter(query, filter); - contacts_query_set_sort(query, _contacts_phone_log.log_time, true); - - err = contacts_db_get_records_with_query(query, 0, 0, list); - IF_FAIL_CATCH_TAG(err == CONTACTS_ERROR_NONE, _E, "contacts_db_get_records_with_query() failed"); - -CATCH: - if (filter) - contacts_filter_destroy(filter); - if (query) - contacts_query_destroy(query); -} - -void ctx::ContactLogAggregator::__destroyContactLogList(contacts_list_h list) -{ - if (list) - contacts_list_destroy(list, true); - - contacts_disconnect(); -} - -void ctx::ContactLogAggregator::__insertContactLogList(contacts_list_h list) -{ - IF_FAIL_VOID(contacts_list_first(list) == CONTACTS_ERROR_NONE); - - do { - contacts_record_h record = NULL; - contacts_list_get_current_record_p(list, &record); - if (record == NULL) break; - - ctx::Json data; - - char* address = NULL; - int logType; - int duration = 0; - int accessTime = 0; - - contacts_record_get_str_p(record, _contacts_phone_log.address, &address); - - if (!address) { - _W("Getting address failed"); - continue; - } - - contacts_record_get_int(record, _contacts_phone_log.log_type, &logType); - contacts_record_get_int(record, _contacts_phone_log.extra_data1, &duration); - contacts_record_get_int(record, _contacts_phone_log.log_time, &accessTime); - - data.set(NULL, SOCIAL_ADDRESS, address); - data.set(NULL, SOCIAL_PHONE_LOG_TYPE, logType); - data.set(NULL, STATS_DURATION, duration); - data.set(NULL, STATS_UNIV_TIME, accessTime); - data.set(NULL, STATS_LOCAL_TIME, accessTime + __timeDiff); - - __dbManager.insert(0, SOCIAL_TABLE_CONTACT_LOG, data, NULL); - - } while(contacts_list_next(list) == CONTACTS_ERROR_NONE); -} - -void ctx::ContactLogAggregator::__removeExpiredLog() -{ - std::stringstream query; - query << "DELETE FROM " SOCIAL_TABLE_CONTACT_LOG " WHERE " \ - STATS_UNIV_TIME " < strftime('%s', 'now') - " << LOG_RETENTION_PERIOD; - __dbManager.execute(0, query.str().c_str(), NULL); -} diff --git a/src/statistics/social/LogAggregator.h b/src/statistics/social/LogAggregator.h deleted file mode 100644 index cc3962d..0000000 --- a/src/statistics/social/LogAggregator.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_SOCIAL_CONTACT_LOG_AGGREGATOR_H_ -#define _CONTEXT_STATS_SOCIAL_CONTACT_LOG_AGGREGATOR_H_ - -#include -#include -#include - -namespace ctx { - - class ContactLogAggregator : public IDatabaseListener, public ITimerListener { - private: - int __timerId; - int __timeDiff; - TimerManager __timerManager; - DatabaseManager __dbManager; - - void __createTable(); - void __getUpdatedContactLogList(int last_time, contacts_list_h *list); - void __insertContactLogList(contacts_list_h list); - void __destroyContactLogList(contacts_list_h list); - void __removeExpiredLog(); - - public: - ContactLogAggregator(); - ~ContactLogAggregator(); - - void aggregateContactLog(); - - void onTableCreated(unsigned int queryId, int error) {} - void onInserted(unsigned int queryId, int error, int64_t rowId) {} - void onExecuted(unsigned int queryId, int error, std::vector& records); - bool onTimerExpired(int timerId); - - }; /* class ContactLogAggregator */ - -} /* namespace ctx */ - -#endif /* End of _CONTEXT_STATS_SOCIAL_CONTACT_LOG_AGGREGTOR_H_ */ diff --git a/src/statistics/social/SocialStatisticsTypes.h b/src/statistics/social/SocialStatisticsTypes.h deleted file mode 100644 index 7c68b93..0000000 --- a/src/statistics/social/SocialStatisticsTypes.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2015 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 _CONTEXT_STATS_SOCIAL_TYPES_H_ -#define _CONTEXT_STATS_SOCIAL_TYPES_H_ - -#include "../shared/CommonTypes.h" - -#define SOCIAL_HISTORY_PRIV "callhistory.read" -#define SOCIAL_SUBJ_LOGGER "stats/contact/logger" -#define SOCIAL_SUBJ_FREQ_ADDRESS "stats/contact/often" -#define SOCIAL_SUBJ_FREQUENCY "stats/contact/frequency" - -#define SOCIAL_TABLE_CONTACT_LOG "Log_Contact" -#define SOCIAL_TABLE_CONTACT_LOG_COLUMNS \ - "Address TEXT NOT NULL, PLogType INTEGER NOT NULL, " \ - "Duration INTEGER NOT NULL DEFAULT 0, " \ - "UTC TIMESTAMP DEFAULT (strftime('%s', 'now')), " \ - "LocalTime TIMESTAMP DEFAULT (strftime('%s', 'now', 'localtime'))" - -#define SOCIAL_TEMP_CONTACT_FREQ "Temp_ContactFreq" -#define SOCIAL_TEMP_CONTACT_FREQ_SQL \ - "CREATE TABLE IF NOT EXISTS " SOCIAL_TEMP_CONTACT_FREQ \ - " (Address TEXT NOT NULL UNIQUE, TotalCount INTEGER DEFAULT 0);" - -#define SOCIAL_COMMUNICATION_TYPE "CommunicationType" -#define SOCIAL_ADDRESS "Address" -#define SOCIAL_PHONE_LOG_TYPE "PLogType" -#define TIME_DIFFERENCE "TimeDIff" - -enum SocialCommType { - SOCIAL_COMMUNICATION_TYPE_CALL = 1, - SOCIAL_COMMUNICATION_TYPE_MESSAGE, - SOCIAL_COMMUNICATION_TYPE_ALL -}; - -#endif /* End of _CONTEXT_STATS_SOCIAL_TYPES_ */ diff --git a/src/statistics/social/SocialStatsLogger.cpp b/src/statistics/social/SocialStatsLogger.cpp deleted file mode 100644 index a32fa80..0000000 --- a/src/statistics/social/SocialStatsLogger.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "SocialStatisticsTypes.h" -#include "SocialStatsLogger.h" - -using namespace ctx; - -SocialStatsLogger::SocialStatsLogger() : - ContextProvider(SOCIAL_SUBJ_LOGGER) -{ -} - -SocialStatsLogger::~SocialStatsLogger() -{ -} - -int SocialStatsLogger::subscribe(Json option, Json* requestResult) -{ - return ERR_NONE; -} - -int SocialStatsLogger::unsubscribe(Json option) -{ - return ERR_NONE; -} diff --git a/src/statistics/social/SocialStatsLogger.h b/src/statistics/social/SocialStatsLogger.h deleted file mode 100644 index 17850e9..0000000 --- a/src/statistics/social/SocialStatsLogger.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_SOCIAL_STATS_LOGGER_H_ -#define _CONTEXT_SOCIAL_STATS_LOGGER_H_ - -#include -#include "LogAggregator.h" - -namespace ctx { - - class SocialStatsLogger : public ContextProvider { - public: - SocialStatsLogger(); - ~SocialStatsLogger(); - - int subscribe(Json option, Json* requestResult); - int unsubscribe(Json option); - - void submitTriggerItem() {} - - private: - ContactLogAggregator __aggregator; - }; - -} /* namespace ctx */ - -#endif /* _CONTEXT_SOCIAL_STATS_LOGGER_H_ */ - diff --git a/src/statistics/social/SocialStatsProvider.cpp b/src/statistics/social/SocialStatsProvider.cpp deleted file mode 100644 index 0c0dd6d..0000000 --- a/src/statistics/social/SocialStatsProvider.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2016 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. - */ - -#include "SocialStatsProvider.h" -#include "DbHandle.h" - -using namespace ctx; - -SocialStatsProvider::SocialStatsProvider(const char *subject) : - ContextProvider(subject) -{ -} - -SocialStatsProvider::~SocialStatsProvider() -{ -} - -bool SocialStatsProvider::isSupported() -{ - /* TODO */ - return true; -} - -void SocialStatsProvider::submitTriggerItem() -{ -} - -int SocialStatsProvider::read(Json option, Json* requestResult) -{ - SocialDbHandle *handle = new(std::nothrow) SocialDbHandle(this); - IF_FAIL_RETURN_TAG(handle, ERR_OPERATION_FAILED, _E, "Memory allocation failed"); - - int err = handle->read(option); - if (err != ERR_NONE) { - delete handle; - return err; - } - - return ERR_NONE; -} - -void ContactFreqProvider::submitTriggerItem() -{ - registerTriggerItem(OPS_READ, - "{" TRIG_DEF_RANK "," TRIG_DEF_TOTAL_COUNT "}", - "{" - "\"Address\":{\"type\":\"string\"}," - TRIG_DEF_TIME_OF_DAY "," TRIG_DEF_DAY_OF_WEEK - "}"); -} diff --git a/src/statistics/social/SocialStatsProvider.h b/src/statistics/social/SocialStatsProvider.h deleted file mode 100644 index 0ee94fd..0000000 --- a/src/statistics/social/SocialStatsProvider.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2016 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 _CONTEXT_SOCIAL_STATS_PROVIDER_H_ -#define _CONTEXT_SOCIAL_STATS_PROVIDER_H_ - -#include -#include "SocialStatisticsTypes.h" - -namespace ctx { - - class SocialStatsProvider : public ContextProvider { - public: - int read(Json option, Json* requestResult); - - bool isSupported(); - virtual void submitTriggerItem(); - - protected: - SocialStatsProvider(const char *subject); - virtual ~SocialStatsProvider(); - }; - - - class ContactFreqProvider: public SocialStatsProvider { - public: - ContactFreqProvider() : - SocialStatsProvider(SOCIAL_SUBJ_FREQUENCY) {} - - void submitTriggerItem(); - }; - - - class TopContactsProvider: public SocialStatsProvider { - public: - TopContactsProvider() : - SocialStatsProvider(SOCIAL_SUBJ_FREQ_ADDRESS) {} - }; - -} /* namespace ctx */ - -#endif /* _CONTEXT_SOCIAL_STATS_PROVIDER_H_ */ diff --git a/src/system/Battery.cpp b/src/system/Battery.cpp new file mode 100644 index 0000000..69b1ecd --- /dev/null +++ b/src/system/Battery.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Battery.h" + +using namespace ctx; + +DeviceStatusBattery::DeviceStatusBattery() + : DeviceProviderBase(DEVICE_ST_SUBJ_BATTERY) +{ +} + +DeviceStatusBattery::~DeviceStatusBattery() +{ +} + +bool DeviceStatusBattery::isSupported() +{ + return true; +} + +void DeviceStatusBattery::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" + "\"Level\":{\"type\":\"string\",\"values\":[\"Empty\",\"Critical\",\"Low\",\"Normal\",\"High\",\"Full\"]}," + TRIG_BOOL_ITEM_DEF("IsCharging") + "}", + NULL); +} + +void DeviceStatusBattery::__updateCb(device_callback_e deviceType, void* value, void* userData) +{ + IF_FAIL_VOID(deviceType == DEVICE_CALLBACK_BATTERY_LEVEL); + + DeviceStatusBattery *instance = static_cast(userData); + instance->__handleUpdate(deviceType, value); +} + +void DeviceStatusBattery::__handleUpdate(device_callback_e deviceType, void* value) +{ + intptr_t level = (intptr_t)value; + + const char* levelString = __transToString(level); + IF_FAIL_VOID(levelString); + + Json dataRead; + dataRead.set(NULL, DEVICE_ST_LEVEL, levelString); + + bool chargingState = false; + int ret = device_battery_is_charging(&chargingState); + IF_FAIL_VOID_TAG(ret == DEVICE_ERROR_NONE, _E, "Getting state failed"); + + dataRead.set(NULL, DEVICE_ST_IS_CHARGING, chargingState ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + publish(NULL, ERR_NONE, dataRead); +} + +const char* DeviceStatusBattery::__transToString(intptr_t level) +{ + switch (level) { + case DEVICE_BATTERY_LEVEL_EMPTY: + return DEVICE_ST_EMPTY; + + case DEVICE_BATTERY_LEVEL_CRITICAL: + return DEVICE_ST_CRITICAL; + + case DEVICE_BATTERY_LEVEL_LOW: + return DEVICE_ST_LOW; + + case DEVICE_BATTERY_LEVEL_HIGH: + return DEVICE_ST_NORMAL; + + case DEVICE_BATTERY_LEVEL_FULL: + { + int percent; + device_battery_get_percent(&percent); + + if (percent == 100) { + return DEVICE_ST_FULL; + } else { + return DEVICE_ST_HIGH; + } + break; + } + + default: + _E("Invalid battery level"); + return NULL; + } +} + +int DeviceStatusBattery::subscribe() +{ + int ret = device_add_callback(DEVICE_CALLBACK_BATTERY_LEVEL, __updateCb, this); + IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int DeviceStatusBattery::unsubscribe() +{ + int ret = device_remove_callback(DEVICE_CALLBACK_BATTERY_LEVEL, __updateCb); + IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int DeviceStatusBattery::read() +{ + device_battery_level_e level; + Json dataRead; + + int ret = device_battery_get_level_status(&level); + IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); + + const char* levelString = __transToString(level); + IF_FAIL_RETURN(levelString, ERR_OPERATION_FAILED); + + dataRead.set(NULL, DEVICE_ST_LEVEL, levelString); + + bool chargingState = false; + ret = device_battery_is_charging(&chargingState); + IF_FAIL_RETURN(ret == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED); + + dataRead.set(NULL, DEVICE_ST_IS_CHARGING, chargingState ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + + replyToRead(NULL, ERR_NONE, dataRead); + return ERR_NONE; +} diff --git a/src/system/Battery.h b/src/system/Battery.h new file mode 100644 index 0000000..34482b4 --- /dev/null +++ b/src/system/Battery.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_BATTERY_H_ +#define _DEVICE_SYSTEM_STATUS_BATTERY_H_ + +#include +#include +#include "../shared/SystemTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class DeviceStatusBattery : public DeviceProviderBase { + public: + DeviceStatusBattery(); + ~DeviceStatusBattery(); + + int subscribe(); + int unsubscribe(); + int read(); + + bool isSupported(); + void submitTriggerItem(); + + private: + const char* __transToString(intptr_t level); + void __handleUpdate(device_callback_e deviceType, void* value); + static void __updateCb(device_callback_e deviceType, void* value, void* userData); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_BATTERY_H_ diff --git a/src/system/Charger.cpp b/src/system/Charger.cpp new file mode 100644 index 0000000..5703747 --- /dev/null +++ b/src/system/Charger.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Charger.h" + +using namespace ctx; + +DeviceStatusCharger::DeviceStatusCharger() : + DeviceStatusRuntimeInfo(DEVICE_ST_SUBJ_CHARGER, RUNTIME_INFO_KEY_CHARGER_CONNECTED) +{ +} + +DeviceStatusCharger::~DeviceStatusCharger() +{ +} + +bool DeviceStatusCharger::isSupported() +{ + return true; +} + +void DeviceStatusCharger::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" TRIG_BOOL_ITEM_DEF("IsConnected") "}", NULL); +} + +void DeviceStatusCharger::handleUpdate() +{ + bool chargerStatus = false; + + int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_CHARGER_CONNECTED, &chargerStatus); + IF_FAIL_VOID_TAG(ret == RUNTIME_INFO_ERROR_NONE, _E, "Getting runtime info failed"); + + Json dataRead; + dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, chargerStatus ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + + publish(NULL, ERR_NONE, dataRead); +} + +int DeviceStatusCharger::read() +{ + bool chargerStatus = false; + Json dataRead; + + int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_CHARGER_CONNECTED, &chargerStatus); + IF_FAIL_RETURN_TAG(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting runtime info failed"); + + dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, chargerStatus ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + + replyToRead(NULL, ERR_NONE, dataRead); + return ERR_NONE; +} diff --git a/src/system/Charger.h b/src/system/Charger.h new file mode 100644 index 0000000..a6746a3 --- /dev/null +++ b/src/system/Charger.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_CHARGER_ +#define _DEVICE_SYSTEM_STATUS_CHARGER_ + +#include "RuntimeInfoBase.h" + +namespace ctx { + + class DeviceStatusCharger : public DeviceStatusRuntimeInfo { + public: + DeviceStatusCharger(); + ~DeviceStatusCharger(); + + int read(); + + bool isSupported(); + void submitTriggerItem(); + + protected: + void handleUpdate(); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_CHARGER_H_ diff --git a/src/system/Gps.cpp b/src/system/Gps.cpp new file mode 100644 index 0000000..9b6d083 --- /dev/null +++ b/src/system/Gps.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Gps.h" + +using namespace ctx; + +static const char* __getStatusString(int gpsStatus) +{ + switch (gpsStatus) { + case RUNTIME_INFO_GPS_STATUS_DISABLED: + return DEVICE_ST_DISABLED; + + case RUNTIME_INFO_GPS_STATUS_SEARCHING: + return DEVICE_ST_SEARCHING; + + case RUNTIME_INFO_GPS_STATUS_CONNECTED: + return DEVICE_ST_CONNECTED; + + default: + _E("Unknown GPS status: %d", gpsStatus); + return NULL; + } +} + +DeviceStatusGps::DeviceStatusGps() : + DeviceStatusRuntimeInfo(DEVICE_ST_SUBJ_GPS, RUNTIME_INFO_KEY_GPS_STATUS) +{ +} + +DeviceStatusGps::~DeviceStatusGps() +{ +} + +bool DeviceStatusGps::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/location.gps"); +} + +void DeviceStatusGps::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" + "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Searching\",\"Connected\"]}" + "}", + NULL); +} + +void DeviceStatusGps::handleUpdate() +{ + int gpsStatus; + int ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_GPS_STATUS, &gpsStatus); + IF_FAIL_VOID_TAG(ret == RUNTIME_INFO_ERROR_NONE, _E, "Getting runtime info failed"); + + Json dataRead; + + const char* stateStr = __getStatusString(gpsStatus); + IF_FAIL_VOID(stateStr); + + dataRead.set(NULL, DEVICE_ST_STATE, stateStr); + + publish(NULL, ERR_NONE, dataRead); +} + +int DeviceStatusGps::read() +{ + int gpsStatus; + Json dataRead; + + int ret = runtime_info_get_value_int(RUNTIME_INFO_KEY_GPS_STATUS, &gpsStatus); + IF_FAIL_RETURN_TAG(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting runtime info failed"); + + const char* stateStr = __getStatusString(gpsStatus); + IF_FAIL_RETURN(stateStr, ERR_OPERATION_FAILED); + + dataRead.set(NULL, DEVICE_ST_STATE, stateStr); + + replyToRead(NULL, ERR_NONE, dataRead); + return ERR_NONE; +} diff --git a/src/system/Gps.h b/src/system/Gps.h new file mode 100644 index 0000000..87acd1b --- /dev/null +++ b/src/system/Gps.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_GPS_H_ +#define _DEVICE_SYSTEM_STATUS_GPS_H_ + +#include "RuntimeInfoBase.h" + +namespace ctx { + + class DeviceStatusGps : public DeviceStatusRuntimeInfo { + public: + DeviceStatusGps(); + ~DeviceStatusGps(); + + int read(); + + bool isSupported(); + void submitTriggerItem(); + + protected: + void handleUpdate(); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_GPS_H_ diff --git a/src/system/Psmode.cpp b/src/system/Psmode.cpp new file mode 100644 index 0000000..c7d61d7 --- /dev/null +++ b/src/system/Psmode.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Psmode.h" + +using namespace ctx; + +DeviceStatusPsmode::DeviceStatusPsmode() : + DeviceProviderBase(DEVICE_ST_SUBJ_PSMODE) +{ +} + +DeviceStatusPsmode::~DeviceStatusPsmode() +{ +} + +bool DeviceStatusPsmode::isSupported() +{ + return true; +} + +void DeviceStatusPsmode::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" TRIG_BOOL_ITEM_DEF("IsEnabled") "}", NULL); +} + +void DeviceStatusPsmode::__updateCb(keynode_t *node, void* userData) +{ + DeviceStatusPsmode *instance = static_cast(userData); + instance->__handleUpdate(node); +} + +void DeviceStatusPsmode::__handleUpdate(keynode_t *node) +{ + int status; + Json dataRead; + + status = vconf_keynode_get_int(node); + IF_FAIL_VOID_TAG(status >= 0, _E, "Getting state failed"); + + dataRead.set(NULL, DEVICE_ST_IS_ENABLED, status == 0 ? DEVICE_ST_FALSE : DEVICE_ST_TRUE); + + publish(NULL, ERR_NONE, dataRead); +} + +int DeviceStatusPsmode::subscribe() +{ + int ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, __updateCb, this); + IF_FAIL_RETURN(ret == VCONF_OK, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int DeviceStatusPsmode::unsubscribe() +{ + int ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE, __updateCb); + IF_FAIL_RETURN(ret == VCONF_OK, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int DeviceStatusPsmode::read() +{ + int mode; + int ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &mode); + IF_FAIL_RETURN(ret == VCONF_OK, ERR_OPERATION_FAILED); + + Json dataRead; + dataRead.set(NULL, DEVICE_ST_IS_ENABLED, mode == 0 ? DEVICE_ST_FALSE : DEVICE_ST_TRUE); + + replyToRead(NULL, ERR_NONE, dataRead); + return ERR_NONE; +} diff --git a/src/system/Psmode.h b/src/system/Psmode.h new file mode 100644 index 0000000..0cbe3cb --- /dev/null +++ b/src/system/Psmode.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_POWER_SAVING_MODE_H_ +#define _DEVICE_SYSTEM_STATUS_POWER_SAVING_MODE_H_ + +#include +#include "../shared/SystemTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class DeviceStatusPsmode : public DeviceProviderBase { + public: + DeviceStatusPsmode(); + ~DeviceStatusPsmode(); + + int subscribe(); + int unsubscribe(); + int read(); + + bool isSupported(); + void submitTriggerItem(); + + private: + void __handleUpdate(keynode_t *node); + static void __updateCb(keynode_t *node, void* userData); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_POWER_SAVING_MODE_H_ diff --git a/src/system/RuntimeInfoBase.cpp b/src/system/RuntimeInfoBase.cpp new file mode 100644 index 0000000..1f745ad --- /dev/null +++ b/src/system/RuntimeInfoBase.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "RuntimeInfoBase.h" + +using namespace ctx; + +DeviceStatusRuntimeInfo::DeviceStatusRuntimeInfo(const char *subject, runtime_info_key_e key) : + DeviceProviderBase(subject), + __infoKey(key) +{ +} + +runtime_info_key_e DeviceStatusRuntimeInfo::__getInfoKey() +{ + return __infoKey; +} + +void DeviceStatusRuntimeInfo::updateCb(runtime_info_key_e runtimeKey, void* userData) +{ + DeviceStatusRuntimeInfo *instance = static_cast(userData); + IF_FAIL_VOID_TAG(runtimeKey == instance->__getInfoKey(), _W, "Runtime info key mismatch"); + instance->handleUpdate(); +} + +int DeviceStatusRuntimeInfo::subscribe() +{ + int ret = runtime_info_set_changed_cb(__infoKey, updateCb, this); + IF_FAIL_RETURN(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED); + return ERR_NONE; +} + +int DeviceStatusRuntimeInfo::unsubscribe() +{ + int ret = runtime_info_unset_changed_cb(__infoKey); + IF_FAIL_RETURN(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED); + return ERR_NONE; +} diff --git a/src/system/RuntimeInfoBase.h b/src/system/RuntimeInfoBase.h new file mode 100644 index 0000000..7d8f6ee --- /dev/null +++ b/src/system/RuntimeInfoBase.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_RUNTIME_INFO_BASE_H_ +#define _DEVICE_SYSTEM_STATUS_RUNTIME_INFO_BASE_H_ + +#include +#include "../shared/SystemTypes.h" +#include "../shared/DeviceProviderBase.h" + +namespace ctx { + + class DeviceStatusRuntimeInfo : public DeviceProviderBase { + public: + DeviceStatusRuntimeInfo(const char *subject, runtime_info_key_e key); + + int subscribe(); + int unsubscribe(); + virtual int read() = 0; + + protected: + runtime_info_key_e __infoKey; + + virtual ~DeviceStatusRuntimeInfo(){} + static void updateCb(runtime_info_key_e runtimeKey, void* userData); + virtual void handleUpdate() = 0; + + private: + runtime_info_key_e __getInfoKey(); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_RUNTIME_INFO_BASE_H_ diff --git a/src/system/Usb.cpp b/src/system/Usb.cpp new file mode 100644 index 0000000..c94edf7 --- /dev/null +++ b/src/system/Usb.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Usb.h" + +using namespace ctx; + +DeviceStatusUsb::DeviceStatusUsb() : + DeviceStatusRuntimeInfo(DEVICE_ST_SUBJ_USB, RUNTIME_INFO_KEY_USB_CONNECTED) +{ +} + +DeviceStatusUsb::~DeviceStatusUsb() +{ +} + +bool DeviceStatusUsb::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/usb.host"); +} + +void DeviceStatusUsb::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" TRIG_BOOL_ITEM_DEF("IsConnected") "}", NULL); +} + +void DeviceStatusUsb::handleUpdate() +{ + bool status = false; + + int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_USB_CONNECTED, &status); + IF_FAIL_VOID_TAG(ret == RUNTIME_INFO_ERROR_NONE, _E, "Getting runtime info failed"); + + Json dataRead; + dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, status ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + + publish(NULL, ERR_NONE, dataRead); +} + +int DeviceStatusUsb::read() +{ + bool status = false; + Json dataRead; + + int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_USB_CONNECTED, &status); + IF_FAIL_RETURN_TAG(ret == RUNTIME_INFO_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Getting runtime info failed"); + + dataRead.set(NULL, DEVICE_ST_IS_CONNECTED, status ? DEVICE_ST_TRUE : DEVICE_ST_FALSE); + + replyToRead(NULL, ERR_NONE, dataRead); + return ERR_NONE; +} diff --git a/src/system/Usb.h b/src/system/Usb.h new file mode 100644 index 0000000..fc8678c --- /dev/null +++ b/src/system/Usb.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_USB_H_ +#define _DEVICE_SYSTEM_STATUS_USB_H_ + +#include "RuntimeInfoBase.h" + +namespace ctx { + + class DeviceStatusUsb : public DeviceStatusRuntimeInfo { + public: + DeviceStatusUsb(); + ~DeviceStatusUsb(); + + int read(); + + bool isSupported(); + void submitTriggerItem(); + + protected: + void handleUpdate(); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_USB_H_ diff --git a/src/time/Alarm.cpp b/src/time/Alarm.cpp new file mode 100644 index 0000000..26bac0b --- /dev/null +++ b/src/time/Alarm.cpp @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2015 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. + */ + +#include "Alarm.h" + +using namespace ctx; + +DeviceStatusAlarm::DeviceStatusAlarm() + : ContextProvider(DEVICE_ST_SUBJ_ALARM) +{ +} + +DeviceStatusAlarm::~DeviceStatusAlarm() +{ + __clear(); + + for (auto it = __optionSet.begin(); it != __optionSet.end(); ++it) { + delete *it; + } + __optionSet.clear(); +} + +bool DeviceStatusAlarm::isSupported() +{ + return true; +} + +void DeviceStatusAlarm::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE, + "{" + "\"TimeOfDay\":{\"type\":\"integer\",\"min\":0,\"max\":1439}," + "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}" + "}", + NULL); +} + +int DeviceStatusAlarm::subscribe(Json option, Json *requestResult) +{ + int dow = __getArrangedDayOfWeek(option); + + int time; + for (int i = 0; option.getAt(NULL, DEVICE_ST_TIME_OF_DAY, i, &time); i++) { + __add(time, dow); + } + + Json* elem = new(std::nothrow) Json(option); + if (elem) { + __optionSet.insert(elem); + } else { + unsubscribe(option); + _E("Memory allocation failed"); + return ERR_OUT_OF_MEMORY; + } + + return ERR_NONE; +} + +int DeviceStatusAlarm::unsubscribe(Json option) +{ + int dow = __getArrangedDayOfWeek(option); + + int time; + for (int i = 0; option.getAt(NULL, DEVICE_ST_TIME_OF_DAY, i, &time); i++) { + __remove(time, dow); + } + + OptionSet::iterator target = __findOption(option); + if (target != __optionSet.end()) { + delete (*target); + __optionSet.erase(target); + } + + return ERR_NONE; +} + +int DeviceStatusAlarm::__getArrangedDayOfWeek(Json& option) +{ + int dow = 0; + + std::string tempDay; + for (int i = 0; option.getAt(NULL, DEVICE_ST_DAY_OF_WEEK, i, &tempDay); i++) { + dow |= TimerManager::dowToInt(tempDay); + } + _D("Requested day of week (%#x)", dow); + + return dow; +} + +DeviceStatusAlarm::RefCountArray::RefCountArray() +{ + memset(count, 0, sizeof(int) * DAYS_PER_WEEK); +} + +int DeviceStatusAlarm::__mergeDayOfWeek(int* refCnt) +{ + int dayOfWeek = 0; + + for (int d = 0; d < DAYS_PER_WEEK; ++d) { + if (refCnt[d] > 0) { + dayOfWeek |= (0x01 << d); + } + } + + return dayOfWeek; +} + +bool DeviceStatusAlarm::__add(int minute, int dayOfWeek) +{ + IF_FAIL_RETURN_TAG(minute >=0 && minute < 1440 && + dayOfWeek > 0 && dayOfWeek <= static_cast(DayOfWeek::EVERYDAY), + false, _E, "Invalid parameter"); + + RefCountArray &ref = __refCountMap[minute]; + + for (int d = 0; d < DAYS_PER_WEEK; ++d) { + if ((dayOfWeek & (0x01 << d)) != 0) { + ref.count[d] += 1; + } + } + + return __resetTimer(minute); +} + +bool DeviceStatusAlarm::__remove(int minute, int dayOfWeek) +{ + IF_FAIL_RETURN_TAG(minute >= 0 && minute < 1440 && + dayOfWeek > 0 && dayOfWeek <= static_cast(DayOfWeek::EVERYDAY), + false, _E, "Invalid parameter"); + + RefCountArray &ref = __refCountMap[minute]; + + for (int d = 0; d < DAYS_PER_WEEK; ++d) { + if ((dayOfWeek & (0x01 << d)) != 0 && ref.count[d] > 0) { + ref.count[d] -= 1; + } + } + + return __resetTimer(minute); +} + +bool DeviceStatusAlarm::__resetTimer(int minute) +{ + int dayOfWeek = __mergeDayOfWeek(__refCountMap[minute].count); + TimerState &timer = __timerStateMap[minute]; + + if (dayOfWeek == timer.dayOfWeek) { + /* Necessary timers are already running... */ + return true; + } + + if (dayOfWeek == 0 && timer.timerId > 0) { + /* Turn off the timer at hour, if it is not necessray anymore. */ + __timerManager.remove(timer.timerId); + __timerStateMap.erase(minute); + __refCountMap.erase(minute); + return true; + } + + if (timer.timerId > 0) { + /* Turn off the current timer, to set a new one. */ + __timerManager.remove(timer.timerId); + timer.timerId = -1; + timer.dayOfWeek = 0; + } + + /* Create a new timer, w.r.t. the new dayOfWeek value. */ + int h = minute / 60; + int m = minute - h * 60; + int tid = __timerManager.setAt(h, m, static_cast(dayOfWeek), this); + IF_FAIL_RETURN_TAG(tid > 0, false, _E, "Timer setting failed"); + + timer.timerId = tid; + timer.dayOfWeek = dayOfWeek; + + return true; +} + +void DeviceStatusAlarm::__clear() +{ + for (auto it = __timerStateMap.begin(); it != __timerStateMap.end(); ++it) { + if (it->second.timerId > 0) { + __timerManager.remove(it->second.timerId); + } + } + + __timerStateMap.clear(); + __refCountMap.clear(); +} + +bool DeviceStatusAlarm::onTimerExpired(int timerId) +{ + time_t rawTime; + struct tm timeInfo; + + time(&rawTime); + tzset(); + localtime_r(&rawTime, &timeInfo); + + int hour = timeInfo.tm_hour; + int min = timeInfo.tm_min; + int dayOfWeek = (0x01 << timeInfo.tm_wday); + + __handleUpdate(hour, min, dayOfWeek); + + return true; +} + +void DeviceStatusAlarm::__handleUpdate(int hour, int min, int dayOfWeek) +{ + _I("Time: %02d:%02d, Day of Week: %#x", hour, min, dayOfWeek); + + Json dataRead; + int resultTime = hour * 60 + min; + std::string resultDay = TimerManager::dowToStr(dayOfWeek); + dataRead.set(NULL, DEVICE_ST_TIME_OF_DAY, resultTime); + dataRead.set(NULL, DEVICE_ST_DAY_OF_WEEK, resultDay); + + for (auto it = __optionSet.begin(); it != __optionSet.end(); ++it) { + Json option = (**it); + if (__isMatched(option, resultTime, resultDay)) { + publish(option, ERR_NONE, dataRead); + } + } +} + +bool DeviceStatusAlarm::__isMatched(Json& option, int time, std::string day) +{ + bool ret = false; + int optionTime; + for (int i = 0; option.getAt(NULL, DEVICE_ST_TIME_OF_DAY, i, &optionTime); i++){ + if (time == optionTime) { + ret = true; + break; + } + } + IF_FAIL_RETURN(ret, false); + + std::string optionDay; + for (int i = 0; option.getAt(NULL, DEVICE_ST_DAY_OF_WEEK, i, &optionDay); i++){ + if (day == optionDay) { + return true; + } + } + + return false; +} + +DeviceStatusAlarm::OptionSet::iterator DeviceStatusAlarm::__findOption(Json& option) +{ + for (auto it = __optionSet.begin(); it != __optionSet.end(); ++it) { + if (option == (**it)) + return it; + } + return __optionSet.end(); +} diff --git a/src/time/Alarm.h b/src/time/Alarm.h new file mode 100644 index 0000000..797e62f --- /dev/null +++ b/src/time/Alarm.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_ALARM_H_ +#define _DEVICE_SYSTEM_STATUS_ALARM_H_ + +#include +#include +#include +#include +#include "../shared/SystemTypes.h" + +namespace ctx { + + class DeviceStatusAlarm : public ContextProvider, ITimerListener { + public: + DeviceStatusAlarm(); + ~DeviceStatusAlarm(); + + int subscribe(Json option, Json *requestResult); + int unsubscribe(Json option); + + bool isSupported(); + void submitTriggerItem(); + + protected: + bool onTimerExpired(int timerId); + + private: + struct RefCountArray { + int count[7]; /* reference counts for days of week*/ + RefCountArray(); + }; + + struct TimerState { + int timerId; + int dayOfWeek; /* day of week, merged into one integer */ + TimerState() : timerId(-1), dayOfWeek(0) {} + }; + + typedef std::map RefCountMap; + typedef std::map TimerStateMap; + typedef std::set OptionSet; + + RefCountMap __refCountMap; + TimerStateMap __timerStateMap; + OptionSet __optionSet; + TimerManager __timerManager; + + bool __add(int minute, int dayOfWeek); + bool __remove(int minute, int dayOfWeek); + bool __resetTimer(int hour); + void __clear(); + void __handleUpdate(int hour, int min, int dayOfWeek); + + int __getArrangedDayOfWeek(Json& option); + int __mergeDayOfWeek(int *refCnt); + + bool __isMatched(Json& option, int time, std::string day); + OptionSet::iterator __findOption(Json& option); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_ALARM_H_ diff --git a/src/time/Time.cpp b/src/time/Time.cpp new file mode 100644 index 0000000..73f3f37 --- /dev/null +++ b/src/time/Time.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "Time.h" + +using namespace ctx; + +DeviceStatusTime::DeviceStatusTime() : + DeviceProviderBase(DEVICE_ST_SUBJ_TIME) +{ +} + +DeviceStatusTime::~DeviceStatusTime() +{ +} + +bool DeviceStatusTime::isSupported() +{ + return true; +} + +void DeviceStatusTime::submitTriggerItem() +{ + registerTriggerItem(OPS_READ, + "{" + "\"TimeOfDay\":{\"type\":\"integer\",\"min\":0,\"max\":1439}," + "\"DayOfWeek\":{\"type\":\"string\",\"values\":[\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",\"Weekday\",\"Weekend\"]}," + "\"DayOfMonth\":{\"type\":\"integer\",\"min\":1,\"max\":31}" + "}", + NULL); +} + +int DeviceStatusTime::subscribe() +{ + return ERR_NOT_SUPPORTED; +} + +int DeviceStatusTime::unsubscribe() +{ + return ERR_NOT_SUPPORTED; +} + +int DeviceStatusTime::read() +{ + time_t rawtime; + struct tm timeInfo; + + time(&rawtime); + tzset(); + localtime_r(&rawtime, &timeInfo); + + int dayOfMonth = timeInfo.tm_mday; + int minuteOfDay = timeInfo.tm_hour * 60 + timeInfo.tm_min; + std::string dayOfWeek = TimerManager::dowToStr(0x01 << timeInfo.tm_wday); + + Json dataRead; + dataRead.set(NULL, DEVICE_ST_DAY_OF_MONTH, dayOfMonth); + dataRead.set(NULL, DEVICE_ST_DAY_OF_WEEK, dayOfWeek); + dataRead.set(NULL, DEVICE_ST_TIME_OF_DAY, minuteOfDay); + + _I("Time: %02d:%02d, Day of Week: %s, Day of Month: %d", timeInfo.tm_hour, timeInfo.tm_min, dayOfWeek.c_str(), dayOfMonth); + + replyToRead(NULL, ERR_NONE, dataRead); + + return ERR_NONE; +} diff --git a/src/time/Time.h b/src/time/Time.h new file mode 100644 index 0000000..48e2202 --- /dev/null +++ b/src/time/Time.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_TIME_H_ +#define _DEVICE_SYSTEM_STATUS_TIME_H_ + +#include "../shared/DeviceProviderBase.h" +#include "../shared/SystemTypes.h" + +namespace ctx { + + class DeviceStatusTime : public DeviceProviderBase { + public: + DeviceStatusTime(); + ~DeviceStatusTime(); + + int subscribe(); + int unsubscribe(); + int read(); + + bool isSupported(); + void submitTriggerItem(); + }; +} + +#endif // _DEVICE_SYSTEM_STATUS_TIME_H_ diff --git a/src/wifi/Wifi.cpp b/src/wifi/Wifi.cpp new file mode 100644 index 0000000..8de9fa4 --- /dev/null +++ b/src/wifi/Wifi.cpp @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2015 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. + */ + +#include +#include "Wifi.h" + +using namespace ctx; + +DeviceStatusWifi::DeviceStatusWifi() : + DeviceProviderBase(DEVICE_ST_SUBJ_WIFI), + __lastState(UNKNOWN), + __isInitialized(false), + __isActivated(false), + __connState(WIFI_CONNECTION_STATE_FAILURE) +{ + IF_FAIL_VOID_TAG(__startMonitor(), _W, "WiFi monitor initialization failed"); + + if (!__getCurrentState()) { + __stopMonitor(); + _W("Getting current WiFi status failed"); + } +} + +DeviceStatusWifi::~DeviceStatusWifi() +{ + __stopMonitor(); +} + +bool DeviceStatusWifi::isSupported() +{ + return getSystemInfoBool("tizen.org/feature/network.wifi"); +} + +void DeviceStatusWifi::submitTriggerItem() +{ + registerTriggerItem(OPS_SUBSCRIBE | OPS_READ, + "{" + "\"State\":{\"type\":\"string\",\"values\":[\"Disabled\",\"Unconnected\",\"Connected\"]}," + "\"BSSID\":{\"type\":\"string\"}" + "}", + NULL); +} + +bool DeviceStatusWifi::__getCurrentState() +{ + int err; + + if (!__isInitialized) { + err = wifi_initialize(); + IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_initialize() failed"); + } + + err = wifi_is_activated(&__isActivated); + IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_is_activated() failed"); + + err = wifi_get_connection_state(&__connState); + IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_get_connection_state() failed"); + + if (__isActivated) { + if (__connState == WIFI_CONNECTION_STATE_CONNECTED) { + __lastState = CONNECTED; + __getBssid(); + } else { + __lastState = UNCONNECTED; + __clearBssid(); + } + } else { + __lastState = DISABLED; + __clearBssid(); + } + + if (!__isInitialized) + wifi_deinitialize(); + + return true; +} + +bool DeviceStatusWifi::__getBssid() +{ + int err; + char *strBuf = NULL; + wifi_ap_h ap = NULL; + + err = wifi_get_connected_ap(&ap); + IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_get_connected_ap() failed"); + + wifi_ap_get_bssid(ap, &strBuf); + __bssid = (strBuf != NULL ? strBuf : ""); + g_free(strBuf); + + wifi_ap_destroy(ap); + + if (__bssid.empty()) + _W("Failed to get BSSID"); + + SharedVars().set(SharedVars::WIFI_BSSID, __bssid); + _D("BSSID: %s", __bssid.c_str()); + + return !__bssid.empty(); +} + +void DeviceStatusWifi::__clearBssid() +{ + __bssid.clear(); + SharedVars().clear(SharedVars::WIFI_BSSID); + _D("No WiFi connection"); +} + +bool DeviceStatusWifi::__getResponsePacket(Json* data) +{ + switch (__lastState) { + case DISABLED: + data->set(NULL, DEVICE_ST_STATE, DEVICE_ST_DISABLED); + break; + + case UNCONNECTED: + data->set(NULL, DEVICE_ST_STATE, DEVICE_ST_UNCONNECTED); + break; + + case CONNECTED: + data->set(NULL, DEVICE_ST_STATE, DEVICE_ST_CONNECTED); + data->set(NULL, DEVICE_ST_BSSID, __bssid); + break; + + default: + return false; + } + + return true; +} + +int DeviceStatusWifi::read() +{ + IF_FAIL_RETURN(__getCurrentState(), ERR_OPERATION_FAILED); + + Json dataRead; + if (__getResponsePacket(&dataRead)) { + replyToRead(NULL, ERR_NONE, dataRead); + return ERR_NONE; + } + + return ERR_OPERATION_FAILED; +} + +bool DeviceStatusWifi::__startMonitor() +{ + IF_FAIL_RETURN(!__isInitialized, true); + + int err; + err = wifi_initialize(); + IF_FAIL_RETURN_TAG(err == WIFI_ERROR_NONE, false, _E, "wifi_initialize() failed"); + + err = wifi_set_device_state_changed_cb(__deviceStateChangedCb, this); + IF_FAIL_CATCH_TAG(err == WIFI_ERROR_NONE, _E, "wifi_set_device_state_changed_cb() failed"); + + err = wifi_set_connection_state_changed_cb(__connectionStateChangedCb, this); + IF_FAIL_CATCH_TAG(err == WIFI_ERROR_NONE, _E, "wifi_set_connection_state_changed_cb() failed"); + + __isInitialized = true; + return true; + +CATCH: + wifi_deinitialize(); + return false; +} + +void DeviceStatusWifi::__stopMonitor() +{ + IF_FAIL_VOID(__isInitialized); + + wifi_unset_device_state_changed_cb(); + wifi_unset_connection_state_changed_cb(); + wifi_deinitialize(); + __isInitialized = false; +} + +int DeviceStatusWifi::subscribe() +{ +#if 0 + IF_FAIL_RETURN(__startMonitor(), ERR_OPERATION_FAILED); + if (!__getCurrentState()) { + __stopMonitor(); + return ERR_OPERATION_FAILED; + } +#endif + + return ERR_NONE; +} + +int DeviceStatusWifi::unsubscribe() +{ +#if 0 + __stopMonitor(); +#endif + return ERR_NONE; +} + +void DeviceStatusWifi::__handleUpdate() +{ + int prevState = __lastState; + + if (__isActivated) { + if (__connState == WIFI_CONNECTION_STATE_CONNECTED) { + __lastState = CONNECTED; + } else { + __lastState = UNCONNECTED; + } + } else { + __lastState = DISABLED; + } + + if (__lastState != prevState) { + if (__lastState == CONNECTED) { + __getBssid(); + } else { + __clearBssid(); + } + + Json data; + if (__beingSubscribed && __getResponsePacket(&data)) + publish(NULL, ERR_NONE, data); + } +} + +void DeviceStatusWifi::__deviceStateChangedCb(wifi_device_state_e state, void *userData) +{ + DeviceStatusWifi *instance = static_cast(userData); + instance->__isActivated = (state == WIFI_DEVICE_STATE_ACTIVATED); + instance->__handleUpdate(); +} + +void DeviceStatusWifi::__connectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData) +{ + DeviceStatusWifi *instance = static_cast(userData); + instance->__connState = state; + instance->__handleUpdate(); +} diff --git a/src/wifi/Wifi.h b/src/wifi/Wifi.h new file mode 100644 index 0000000..2c5cee6 --- /dev/null +++ b/src/wifi/Wifi.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2015 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 _DEVICE_SYSTEM_STATUS_WIFI_H_ +#define _DEVICE_SYSTEM_STATUS_WIFI_H_ + +#include +#include +#include "../shared/DeviceProviderBase.h" +#include "../shared/SystemTypes.h" + +namespace ctx { + + class DeviceStatusWifi : public DeviceProviderBase { + public: + DeviceStatusWifi(); + ~DeviceStatusWifi(); + + int subscribe(); + int unsubscribe(); + int read(); + + bool isSupported(); + void submitTriggerItem(); + + private: + enum InternalState { + UNKNOWN = -1, + DISABLED = 0, + UNCONNECTED, + CONNECTED, + }; + + int __lastState; + bool __isInitialized; + bool __isActivated; + wifi_connection_state_e __connState; + std::string __bssid; + + bool __getCurrentState(); + bool __getBssid(); + void __clearBssid(); + bool __getResponsePacket(Json* data); + void __handleUpdate(); + bool __startMonitor(); + void __stopMonitor(); + static void __deviceStateChangedCb(wifi_device_state_e state, void *userData); + static void __connectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap, void *userData); + }; +} + +#endif // _CONTEXT_SYSTEM_STATUS_WIFI_H_