diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8fd6ec67b..40336bc8a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,6 +24,7 @@ set(CMAKE_COLOR_MAKEFILE ON)
# Include cmake modules
include(CheckIncludeFiles)
include(CheckLibraryExists)
+include(CheckStructHasMember)
include(FindPkgConfig)
include(TestBigEndian)
@@ -98,6 +99,8 @@ check_include_files(stdint.h HAVE_STDINT_H)
check_include_files(stdbool.h HAVE_STDBOOL_H)
check_include_files(inttypes.h HAVE_INTTYPES_H)
+check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
+
# Libraries that we have a hard dependency on
find_required_package(OpenSSL)
diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c
index 0850a78e5..6a6e8904e 100644
--- a/client/X11/xf_window.c
+++ b/client/X11/xf_window.c
@@ -288,7 +288,10 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height,
if (class_hints != NULL)
{
class_hints->res_name = "xfreerdp";
- class_hints->res_class = "xfreerdp";
+ if (xfi->instance->settings->wm_class != NULL)
+ class_hints->res_class = xfi->instance->settings->wm_class;
+ else
+ class_hints->res_class = "xfreerdp";
XSetClassHint(xfi->display, window->handle, class_hints);
XFree(class_hints);
}
@@ -423,14 +426,19 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width,
if (class_hints != NULL)
{
- char* class;
- class = xmalloc(sizeof(rail_window_class));
- snprintf(class, sizeof(rail_window_class), "RAIL:%08X", id);
+ char* class = NULL;
+ if (xfi->instance->settings->wm_class != NULL)
+ class_hints->res_class = xfi->instance->settings->wm_class;
+ else {
+ class = malloc(sizeof(rail_window_class));
+ snprintf(class, sizeof(rail_window_class), "RAIL:%08X", id);
+ class_hints->res_class = class;
+ }
class_hints->res_name = "RAIL";
- class_hints->res_class = class;
XSetClassHint(xfi->display, window->handle, class_hints);
XFree(class_hints);
- xfree(class);
+ if (class)
+ free(class);
}
XSetWMProtocols(xfi->display, window->handle, &(xfi->WM_DELETE_WINDOW), 1);
diff --git a/client/X11/xfreerdp.1.xml b/client/X11/xfreerdp.1.xml
index e1ce29ef4..6ccf42fc8 100644
--- a/client/X11/xfreerdp.1.xml
+++ b/client/X11/xfreerdp.1.xml
@@ -526,6 +526,15 @@
+
+ --wm-class class
+
+
+ Set WM_CLASS hint of xfreerdp to class. The
+ resulting hint is then "xfreerdp", "class".
+
+
+
diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake
index 995d7a869..f8e49a3c0 100644
--- a/cmake/ConfigOptions.cmake
+++ b/cmake/ConfigOptions.cmake
@@ -2,6 +2,7 @@ option(WITH_DEBUG_TRANSPORT "Print transport debug messages." OFF)
option(WITH_DEBUG_CHANNELS "Print channel manager debug messages." OFF)
option(WITH_DEBUG_SVC "Print static virtual channel debug messages." OFF)
option(WITH_DEBUG_DVC "Print dynamic virtual channel debug messages." OFF)
+option(WITH_DEBUG_TIMEZONE "Print timezone redirection related messages." OFF)
option(WITH_DEBUG_KBD "Print keyboard related debug messages." OFF)
option(WITH_DEBUG_NLA "Print authentication related debug messages." OFF)
option(WITH_DEBUG_NEGO "Print negotiation related debug messages." OFF)
diff --git a/config.h.in b/config.h.in
index 39bf60517..6e6225e26 100644
--- a/config.h.in
+++ b/config.h.in
@@ -19,6 +19,8 @@
#cmakedefine HAVE_STDBOOL_H
#cmakedefine HAVE_INTTYPES_H
+#cmakedefine HAVE_TM_GMTOFF
+
/* Endian */
#cmakedefine BIG_ENDIAN
@@ -27,6 +29,7 @@
#cmakedefine WITH_DEBUG_CHANNELS
#cmakedefine WITH_DEBUG_SVC
#cmakedefine WITH_DEBUG_DVC
+#cmakedefine WITH_DEBUG_TIMEZONE
#cmakedefine WITH_DEBUG_KBD
#cmakedefine WITH_DEBUG_NLA
#cmakedefine WITH_DEBUG_NEGO
diff --git a/include/freerdp/kbd/locales.h b/include/freerdp/kbd/locales.h
index 3da718452..7432b409e 100644
--- a/include/freerdp/kbd/locales.h
+++ b/include/freerdp/kbd/locales.h
@@ -230,99 +230,6 @@
#define YORUBA 0x046A
#define ZULU 0x0435
-
-/*
-Time zones, taken from Windows Server 2008
-
-(GMT -12:00) International Date Line West
-(GMT -11:00) Midway Island, Samoa
-(GMT -10:00) Hawaii
-(GMT -09:00) Alaska
-(GMT -08:00) Pacific Time (US & Canada)
-(GMT -08:00) Tijuana, Baja California
-(GMT -07:00) Arizona
-(GMT -07:00) Chihuahua, La Paz, Mazatlan
-(GMT -07:00) Mountain Time (US & Canada)
-(GMT -06:00) Central America
-(GMT -06:00) Central Time (US & Canada)
-(GMT -06:00) Guadalajara, Mexico City, Monterrey
-(GMT -06:00) Saskatchewan
-(GMT -05:00) Bogota, Lima, Quito, Rio Branco
-(GMT -05:00) Eastern Time (US & Canada)
-(GMT -05:00) Indiana (East)
-(GMT -04:30) Caracas
-(GMT -04:00) Atlantic Time (Canada)
-(GMT -04:00) La Paz
-(GMT -04:00) Manaus
-(GMT -04:00) Santiago
-(GMT -03:30) Newfoundland
-(GMT -03:00) Brasilia
-(GMT -03:00) Buenos Aires
-(GMT -03:00) Georgetown
-(GMT -03:00) Greenland
-(GMT -03:00) Montevideo
-(GMT -02:00) Mid-Atlantic
-(GMT -01:00) Azores
-(GMT -01:00) Cape Verde Is.
-(GMT +00:00) Casablanca
-(GMT +00:00) Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London
-(GMT +00:00) Monrovia, Reykjavik
-(GMT +01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
-(GMT +01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
-(GMT +01:00) Brussels, Copenhagen, Madrid, Paris
-(GMT +01:00) Sarajevo, Skopje, Warsaw, Zagreb
-(GMT +01:00) West Central Africa
-(GMT +02:00) Amman
-(GMT +02:00) Athens, Bucharest, Istanbul
-(GMT +02:00) Beirut
-(GMT +02:00) Cairo
-(GMT +02:00) Harare, Pretoria
-(GMT +02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius
-(GMT +02:00) Jerusalem
-(GMT +02:00) Minsk
-(GMT +02:00) Windhoek
-(GMT +03:00) Baghdad
-(GMT +03:00) Kuwait, Riyadh
-(GMT +03:00) Moscow, St. Petersburg, Volgograd
-(GMT +03:00) Nairobi
-(GMT +03:00) Tbilisi
-(GMT +03:30) Tehran
-(GMT +04:00) Abu Dhabi, Muscat
-(GMT +04:00) Baku
-(GMT +04:00) Port Louis
-(GMT +04:00) Yerevan
-(GMT +04:30) Kabul
-(GMT +05:00) Ekaterinburg
-(GMT +05:00) Islamabad, Karachi
-(GMT +05:00) Tashkent
-(GMT +05:30) Chennai, Kolkata, Mumbai, New Delhi
-(GMT +05:30) Sri Jayawardenepura
-(GMT +05:45) Kathmandu
-(GMT +06:00) Almaty, Novosibirsk
-(GMT +06:00) Astana, Dhaka
-(GMT +06:30) Yangon (Rangoon)
-(GMT +07:00) Bangkok, Hanoi, Jakarta
-(GMT +07:00) Krasnoyarsk
-(GMT +08:00) Beijing, Chongqing, Hong Kong, Urumqi
-(GMT +08:00) Irkutsk, Ulaan Bataar
-(GMT +08:00) Kuala Lumpur, Singapore
-(GMT +08:00) Perth
-(GMT +08:00) Taipei
-(GMT +09:00) Osaka, Sapporo, Tokyo
-(GMT +09:00) Seoul
-(GMT +09:00) Yakutsk
-(GMT +09:30) Adelaide
-(GMT +09:30) Darwin
-(GMT +10:00) Brisbane
-(GMT +10:00) Canberra, Melbourne, Sydney
-(GMT +10:00) Guam, Port Moresby
-(GMT +10:00) Hobart, Vladivostok
-(GMT +11:00) Magadan, Solomon Is., New Caledonia
-(GMT +12:00) Auckland, Wellington
-(GMT +12:00) Fiji, Kamchatka, Marshall Is.
-(GMT +13:00) Nuku'alofa
-*/
-
FREERDP_API uint32 detect_keyboard_layout_from_locale(void);
#endif /* __LOCALES_H */
diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h
index 374774026..b95eb09a8 100644
--- a/include/freerdp/settings.h
+++ b/include/freerdp/settings.h
@@ -291,7 +291,8 @@ struct rdp_settings
boolean mouse_motion; /* 86 */
char* window_title; /* 87 */
uint64 parent_window_xid; /* 88 */
- uint32 paddingD[112 - 89]; /* 89 */
+ char* wm_class; /* 89 */
+ uint32 paddingD[112 - 90]; /* 90 */
/* Internal Parameters */
char* home_path; /* 112 */
diff --git a/include/freerdp/utils/memory.h b/include/freerdp/utils/memory.h
index 892a7ad94..75f81aa38 100644
--- a/include/freerdp/utils/memory.h
+++ b/include/freerdp/utils/memory.h
@@ -31,4 +31,6 @@ FREERDP_API char* xstrdup(const char* str);
#define xnew(_type) (_type*)xzalloc(sizeof(_type))
+#define ARRAY_SIZE(_x) (sizeof(_x)/sizeof(*(_x)))
+
#endif /* __MEMORY_UTILS_H */
diff --git a/include/freerdp/utils/time.h b/include/freerdp/utils/time.h
new file mode 100644
index 000000000..754bf800b
--- /dev/null
+++ b/include/freerdp/utils/time.h
@@ -0,0 +1,36 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Time Utils
+ *
+ * Copyright 2012 Marc-Andre Moreau
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 FREERDP_TIME_UTILS_H
+#define FREERDP_TIME_UTILS_H
+
+#include
+
+#ifndef _WIN32
+#include
+#endif
+
+#include
+#include
+
+FREERDP_API uint64 rdp_windows_gmtime();
+FREERDP_API uint64 rdp_get_windows_time_from_unix_time(time_t unix_time);
+FREERDP_API time_t rdp_get_unix_time_from_windows_time(uint64 windows_time);
+
+#endif /* FREERDP_TIME_UTILS_H */
diff --git a/libfreerdp-core/CMakeLists.txt b/libfreerdp-core/CMakeLists.txt
index 939a9cf52..b01d5f967 100644
--- a/libfreerdp-core/CMakeLists.txt
+++ b/libfreerdp-core/CMakeLists.txt
@@ -63,6 +63,8 @@ set(LIBFREERDP_CORE_SRCS
connection.h
redirection.c
redirection.h
+ timezone.c
+ timezone.h
rdp.c
rdp.h
per.c
diff --git a/libfreerdp-core/info.c b/libfreerdp-core/info.c
index a10999ba5..dbfe5a942 100644
--- a/libfreerdp-core/info.c
+++ b/libfreerdp-core/info.c
@@ -17,6 +17,8 @@
* limitations under the License.
*/
+#include "timezone.h"
+
#include "info.h"
#define INFO_TYPE_LOGON 0x00000000
@@ -34,182 +36,6 @@ static const char* const INFO_TYPE_LOGON_STRINGS[] =
};
*/
-/**
- * Read SYSTEM_TIME structure (TS_SYSTEMTIME).\n
- * @msdn{cc240478}
- * @param s stream
- * @param system_time system time structure
- */
-
-void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time)
-{
- stream_read_uint16(s, system_time->wYear); /* wYear, must be set to 0 */
- stream_read_uint16(s, system_time->wMonth); /* wMonth */
- stream_read_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */
- stream_read_uint16(s, system_time->wDay); /* wDay */
- stream_read_uint16(s, system_time->wHour); /* wHour */
- stream_read_uint16(s, system_time->wMinute); /* wMinute */
- stream_read_uint16(s, system_time->wSecond); /* wSecond */
- stream_read_uint16(s, system_time->wMilliseconds); /* wMilliseconds */
-}
-
-/**
- * Write SYSTEM_TIME structure (TS_SYSTEMTIME).\n
- * @msdn{cc240478}
- * @param s stream
- * @param system_time system time structure
- */
-
-void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time)
-{
- stream_write_uint16(s, system_time->wYear); /* wYear, must be set to 0 */
- stream_write_uint16(s, system_time->wMonth); /* wMonth */
- stream_write_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */
- stream_write_uint16(s, system_time->wDay); /* wDay */
- stream_write_uint16(s, system_time->wHour); /* wHour */
- stream_write_uint16(s, system_time->wMinute); /* wMinute */
- stream_write_uint16(s, system_time->wSecond); /* wSecond */
- stream_write_uint16(s, system_time->wMilliseconds); /* wMilliseconds */
-}
-
-/**
- * Get client time zone information.\n
- * @param s stream
- * @param settings settings
- */
-
-void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings)
-{
- time_t t;
- struct tm* local_time;
- TIME_ZONE_INFO* clientTimeZone;
-
- time(&t);
- local_time = localtime(&t);
- clientTimeZone = settings->client_time_zone;
-
-#if defined(sun)
- if(local_time->tm_isdst > 0)
- clientTimeZone->bias = (uint32) (altzone / 3600);
- else
- clientTimeZone->bias = (uint32) (timezone / 3600);
-#elif defined(HAVE_TM_GMTOFF)
- if(local_time->tm_gmtoff >= 0)
- clientTimeZone->bias = (uint32) (local_time->tm_gmtoff / 60);
- else
- clientTimeZone->bias = (uint32) ((-1 * local_time->tm_gmtoff) / 60 + 720);
-#else
- clientTimeZone->bias = 0;
-#endif
-
- if(local_time->tm_isdst > 0)
- {
- clientTimeZone->standardBias = clientTimeZone->bias - 60;
- clientTimeZone->daylightBias = clientTimeZone->bias;
- }
- else
- {
- clientTimeZone->standardBias = clientTimeZone->bias;
- clientTimeZone->daylightBias = clientTimeZone->bias + 60;
- }
-
- strftime(clientTimeZone->standardName, 32, "%Z, Standard Time", local_time);
- clientTimeZone->standardName[31] = 0;
- strftime(clientTimeZone->daylightName, 32, "%Z, Summer Time", local_time);
- clientTimeZone->daylightName[31] = 0;
-}
-
-/**
- * Read client time zone information (TS_TIME_ZONE_INFORMATION).\n
- * @msdn{cc240477}
- * @param s stream
- * @param settings settings
- */
-
-boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings)
-{
- char* str;
- TIME_ZONE_INFO* clientTimeZone;
-
- if (stream_get_left(s) < 172)
- return false;
-
- clientTimeZone = settings->client_time_zone;
-
- stream_read_uint32(s, clientTimeZone->bias); /* Bias */
-
- /* standardName (64 bytes) */
- str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64);
- stream_seek(s, 64);
- strncpy(clientTimeZone->standardName, str, sizeof(clientTimeZone->standardName));
- xfree(str);
-
- rdp_read_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
- stream_read_uint32(s, clientTimeZone->standardBias); /* StandardBias */
-
- /* daylightName (64 bytes) */
- str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64);
- stream_seek(s, 64);
- strncpy(clientTimeZone->daylightName, str, sizeof(clientTimeZone->daylightName));
- xfree(str);
-
- rdp_read_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
- stream_read_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */
-
- return true;
-}
-
-/**
- * Write client time zone information (TS_TIME_ZONE_INFORMATION).\n
- * @msdn{cc240477}
- * @param s stream
- * @param settings settings
- */
-
-void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings)
-{
- size_t length;
- uint8* standardName;
- uint8* daylightName;
- size_t standardNameLength;
- size_t daylightNameLength;
- TIME_ZONE_INFO* clientTimeZone;
-
- rdp_get_client_time_zone(s, settings);
- clientTimeZone = settings->client_time_zone;
-
- standardName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->standardName, &length);
- standardNameLength = length;
-
- daylightName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->daylightName, &length);
- daylightNameLength = length;
-
- if (standardNameLength > 62)
- standardNameLength = 62;
-
- if (daylightNameLength > 62)
- daylightNameLength = 62;
-
- stream_write_uint32(s, clientTimeZone->bias); /* Bias */
-
- /* standardName (64 bytes) */
- stream_write(s, standardName, standardNameLength);
- stream_write_zero(s, 64 - standardNameLength);
-
- rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
- stream_write_uint32(s, clientTimeZone->standardBias); /* StandardBias */
-
- /* daylightName (64 bytes) */
- stream_write(s, daylightName, daylightNameLength);
- stream_write_zero(s, 64 - daylightNameLength);
-
- rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
- stream_write_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */
-
- xfree(standardName);
- xfree(daylightName);
-}
-
/**
* Read Server Auto Reconnect Cookie (ARC_SC_PRIVATE_PACKET).\n
* @msdn{cc240540}
diff --git a/libfreerdp-core/rdp.c b/libfreerdp-core/rdp.c
index cd5a640a7..580fbe598 100644
--- a/libfreerdp-core/rdp.c
+++ b/libfreerdp-core/rdp.c
@@ -642,7 +642,8 @@ boolean rdp_decrypt(rdpRdp* rdp, STREAM* s, int length, uint16 securityFlags)
stream_read(s, wmac, sizeof(wmac));
length -= sizeof(wmac);
- security_decrypt(s->p, length, rdp);
+ if (!security_decrypt(s->p, length, rdp))
+ return false;
if (securityFlags & SEC_SECURE_CHECKSUM)
security_salted_mac_signature(rdp, s->p, length, false, cmac);
else
diff --git a/libfreerdp-core/security.c b/libfreerdp-core/security.c
index 9571f0011..d93c3b9a8 100644
--- a/libfreerdp-core/security.c
+++ b/libfreerdp-core/security.c
@@ -475,6 +475,9 @@ boolean security_encrypt(uint8* data, int length, rdpRdp* rdp)
boolean security_decrypt(uint8* data, int length, rdpRdp* rdp)
{
+ if (rdp->decrypt_key == NULL)
+ return false;
+
if (rdp->decrypt_use_count >= 4096)
{
security_key_update(rdp->decrypt_key, rdp->decrypt_update_key, rdp->rc4_key_len);
diff --git a/libfreerdp-core/timezone.c b/libfreerdp-core/timezone.c
new file mode 100644
index 000000000..3d3eb8b52
--- /dev/null
+++ b/libfreerdp-core/timezone.c
@@ -0,0 +1,1868 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Time Zone Redirection
+ *
+ * Copyright 2012 Marc-Andre Moreau
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 "timezone.h"
+
+/* Time Zone Redirection table generated with TimeZones.cs script */
+
+
+struct _SYSTEM_TIME_ENTRY
+{
+ uint16 wYear;
+ uint16 wMonth;
+ uint16 wDayOfWeek;
+ uint16 wDay;
+ uint16 wHour;
+ uint16 wMinute;
+ uint16 wSecond;
+ uint16 wMilliseconds;
+};
+typedef struct _SYSTEM_TIME_ENTRY SYSTEM_TIME_ENTRY;
+
+struct _TIME_ZONE_RULE_ENTRY
+{
+ uint64 TicksStart;
+ uint64 TicksEnd;
+ sint32 DaylightDelta;
+ SYSTEM_TIME_ENTRY StandardDate;
+ SYSTEM_TIME_ENTRY DaylightDate;
+};
+typedef struct _TIME_ZONE_RULE_ENTRY TIME_ZONE_RULE_ENTRY;
+
+struct _TIME_ZONE_ENTRY
+{
+ const char* Id;
+ uint32 Bias;
+ boolean SupportsDST;
+ const char* DisplayName;
+ const char* StandardName;
+ const char* DaylightName;
+ TIME_ZONE_RULE_ENTRY* RuleTable;
+ uint32 RuleTableCount;
+};
+typedef struct _TIME_ZONE_ENTRY TIME_ZONE_ENTRY;
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_3[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_4[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_5[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_7[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_8[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_10[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_11[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_14[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_15[] =
+{
+ { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_17[] =
+{
+ { 633662964000000000ULL, 180000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 9, 6, 1, 23, 59 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 637450740000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_18[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_19[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 2, 0, 1, 2, 0 }, { 0, 11, 0, 1, 0, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 0, 1, 0, 0 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638395956000000000ULL, 638081460000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638712180000000000ULL, 638396820000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639027540000000000ULL, 638713044000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639342900000000000ULL, 639028404000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639658260000000000ULL, 639343764000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639974484000000000ULL, 639659124000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640289844000000000ULL, 639975348000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640605204000000000ULL, 640290708000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640920564000000000ULL, 640606068000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641236788000000000ULL, 640921428000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641552148000000000ULL, 641237652000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641867508000000000ULL, 641553012000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642182868000000000ULL, 641868372000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642499092000000000ULL, 642183732000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642814452000000000ULL, 642499956000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 643129812000000000ULL, 642815316000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 643445172000000000ULL, 643130676000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 643446036000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_21[] =
+{
+ { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 4, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 5, 6, 1, 23, 59 }, { 0, 8, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 634609908000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_22[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 0, 1 }, { 0, 4, 0, 1, 0, 1 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 11, 0, 1, 0, 1 }, { 0, 3, 0, 1, 0, 1 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 0, 1 }, },
+ { 3155378292000000000ULL, 634609908000000000ULL, 60, { 0, 11, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_23[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 2, 0, 1, 2, 0 }, { 0, 11, 0, 1, 0, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 0, 1, 0, 0 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 2, 0, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638395956000000000ULL, 638081460000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638712180000000000ULL, 638396820000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639027540000000000ULL, 638713044000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639342900000000000ULL, 639028404000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639658260000000000ULL, 639343764000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639974484000000000ULL, 639659124000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640289844000000000ULL, 639975348000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640605204000000000ULL, 640290708000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640920564000000000ULL, 640606068000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641236788000000000ULL, 640921428000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641552148000000000ULL, 641237652000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641867508000000000ULL, 641553012000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642182868000000000ULL, 641868372000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642499092000000000ULL, 642183732000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642814452000000000ULL, 642499956000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 643129812000000000ULL, 642815316000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 643445172000000000ULL, 643130676000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 643446036000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_24[] =
+{
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 1, 1, 1, 0, 0 }, { 0, 12, 0, 1, 0, 0 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 3, 0, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 6, 1, 23, 59 }, { 0, 1, 4, 1, 0, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_26[] =
+{
+ { 633662964000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, },
+ { 3155378292000000000ULL, 637450740000000000ULL, 60, { 0, 10, 6, 1, 23, 0 }, { 0, 3, 6, 1, 22, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_27[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 2, 0 }, { 0, 9, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 3, 0, 1, 2, 0 }, { 0, 10, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_28[] =
+{
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 1, 6, 1, 0, 0 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638395956000000000ULL, 638081460000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 638712180000000000ULL, 638396820000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639027540000000000ULL, 638713044000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639342900000000000ULL, 639028404000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639658260000000000ULL, 639343764000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 639974484000000000ULL, 639659124000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640289844000000000ULL, 639975348000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640605204000000000ULL, 640290708000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 640920564000000000ULL, 640606068000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641236788000000000ULL, 640921428000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641552148000000000ULL, 641237652000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 641867508000000000ULL, 641553012000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642182868000000000ULL, 641868372000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642499092000000000ULL, 642183732000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 642814452000000000ULL, 642499956000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 643129812000000000ULL, 642815316000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 643445172000000000ULL, 643130676000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 643446036000000000ULL, 60, { 0, 2, 6, 1, 23, 59 }, { 0, 10, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_30[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_31[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_33[] =
+{
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 8, 0, 1, 23, 59 }, { 0, 5, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 8, 4, 1, 23, 59 }, { 0, 5, 0, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 8, 6, 1, 23, 59 }, { 0, 5, 6, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 7, 6, 1, 23, 59 }, { 0, 4, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_35[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 0, 1, 1, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_37[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_38[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_39[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_40[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_42[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, -60, { 0, 9, 0, 1, 2, 0 }, { 0, 4, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 634294548000000000ULL, 60, { 0, 4, 0, 1, 2, 0 }, { 0, 9, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_43[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 9, 5, 1, 1, 0 }, { 0, 3, 4, 1, 0, 0 }, },
+ { 3155378292000000000ULL, 633032244000000000ULL, 60, { 0, 10, 5, 1, 1, 0 }, { 0, 3, 4, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_44[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_45[] =
+{
+ { 633978324000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 0, 0 }, { 0, 3, 0, 1, 0, 0 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 637450740000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_46[] =
+{
+ { 632716020000000000ULL, 180000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 5, 1, 0, 0 }, },
+ { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 5, 1, 0, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 8, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 8, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 9, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_47[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 9, 3, 1, 23, 59 }, { 0, 3, 5, 1, 23, 59 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 11, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 10, 5, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 636188436000000000ULL, 60, { 0, 10, 4, 1, 23, 59 }, { 0, 4, 4, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_49[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_50[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 1, 1, 3, 0 }, },
+ { 3155378292000000000ULL, 634609908000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 3, 0, 1, 3, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_51[] =
+{
+ { 632716020000000000ULL, 632401524000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, },
+ { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 635240628000000000ULL, 634926132000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 635555988000000000ULL, 635241492000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 635871348000000000ULL, 635556852000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 636187572000000000ULL, 635872212000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, },
+ { 636502932000000000ULL, 636188436000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 636818292000000000ULL, 636503796000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 637133652000000000ULL, 636819156000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 637449876000000000ULL, 637134516000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 637765236000000000ULL, 637450740000000000ULL, 60, { 0, 9, 0, 1, 2, 0 }, { 0, 3, 5, 1, 2, 0 }, },
+ { 638080596000000000ULL, 637766100000000000ULL, 60, { 0, 10, 0, 1, 2, 0 }, { 0, 4, 5, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_52[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_53[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 4, 0 }, { 0, 4, 0, 1, 3, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 10, 1, 1, 4, 0 }, { 0, 4, 0, 1, 3, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_54[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_57[] =
+{
+ { 632716020000000000ULL, 180000000000ULL, 60, { 0, 9, 2, 1, 2, 0 }, { 0, 3, 0, 1, 2, 0 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 9, 6, 1, 23, 59 }, { 0, 3, 4, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 633663828000000000ULL, 60, { 0, 9, 1, 1, 23, 59 }, { 0, 3, 6, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_59[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 5, 0 }, { 0, 3, 0, 1, 4, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_60[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_61[] =
+{
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 1, 2, 1, 0, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 0, 1, 2, 0 }, { 0, 1, 4, 1, 0, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_63[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_65[] =
+{
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 10, 5, 1, 23, 59 }, { 0, 5, 6, 1, 23, 59 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 10, 6, 1, 23, 59 }, { 0, 4, 2, 1, 23, 59 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_71[] =
+{
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 12, 4, 1, 23, 59 }, { 0, 6, 5, 1, 23, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_72[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_75[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_77[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_79[] =
+{
+ { 633031380000000000ULL, 632716884000000000ULL, 60, { 0, 1, 0, 1, 0, 0 }, { 0, 12, 0, 1, 2, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 633662964000000000ULL, 633347604000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 1, 4, 1, 0, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_82[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_85[] =
+{
+ { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_88[] =
+{
+ { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_90[] =
+{
+ { 633346740000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_91[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_93[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_94[] =
+{
+ { 633031380000000000ULL, 180000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 633346740000000000ULL, 633032244000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 9, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 633347604000000000ULL, 60, { 0, 4, 0, 1, 3, 0 }, { 0, 9, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_96[] =
+{
+ { 633978324000000000ULL, 633663828000000000ULL, 60, { 0, 1, 4, 1, 0, 0 }, { 0, 11, 0, 1, 2, 0 }, },
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 634609044000000000ULL, 634294548000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 634925268000000000ULL, 634609908000000000ULL, 60, { 0, 1, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, },
+ { 3155378292000000000ULL, 634926132000000000ULL, 60, { 0, 3, 0, 1, 3, 0 }, { 0, 10, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_97[] =
+{
+ { 634293684000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_98[] =
+{
+ { 3155378292000000000ULL, 180000000000ULL, 60, { 0, 10, 0, 1, 3, 0 }, { 0, 3, 0, 1, 2, 0 }, }
+};
+
+static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_100[] =
+{
+ { 634293684000000000ULL, 633979188000000000ULL, 60, { 0, 1, 5, 1, 0, 0 }, { 0, 9, 6, 1, 23, 59 }, },
+ { 3155378292000000000ULL, 634294548000000000ULL, 60, { 0, 4, 0, 1, 1, 0 }, { 0, 9, 0, 1, 0, 0 }, }
+};
+
+static const TIME_ZONE_ENTRY TimeZoneTable[] =
+{
+ {
+ "Dateline Standard Time", 720, false, "(UTC-12:00) International Date Line West",
+ "Dateline Standard Time", "Dateline Daylight Time",
+ NULL, 0
+ },
+ {
+ "UTC-11", 780, false, "(UTC-11:00) Coordinated Universal Time-11",
+ "UTC-11", "UTC-11",
+ NULL, 0
+ },
+ {
+ "Hawaiian Standard Time", 840, false, "(UTC-10:00) Hawaii",
+ "Hawaiian Standard Time", "Hawaiian Daylight Time",
+ NULL, 0
+ },
+ {
+ "Alaskan Standard Time", 900, true, "(UTC-09:00) Alaska",
+ "Alaskan Standard Time", "Alaskan Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_3, 2
+ },
+ {
+ "Pacific Standard Time (Mexico)", 960, true, "(UTC-08:00) Baja California",
+ "Pacific Standard Time (Mexico)", "Pacific Daylight Time (Mexico)",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_4, 1
+ },
+ {
+ "Pacific Standard Time", 960, true, "(UTC-08:00) Pacific Time (US & Canada)",
+ "Pacific Standard Time", "Pacific Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_5, 2
+ },
+ {
+ "US Mountain Standard Time", 1020, false, "(UTC-07:00) Arizona",
+ "US Mountain Standard Time", "US Mountain Daylight Time",
+ NULL, 0
+ },
+ {
+ "Mountain Standard Time (Mexico)", 1020, true, "(UTC-07:00) Chihuahua, La Paz, Mazatlan",
+ "Mountain Standard Time (Mexico)", "Mountain Daylight Time (Mexico)",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_7, 1
+ },
+ {
+ "Mountain Standard Time", 1020, true, "(UTC-07:00) Mountain Time (US & Canada)",
+ "Mountain Standard Time", "Mountain Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_8, 2
+ },
+ {
+ "Central America Standard Time", 1080, false, "(UTC-06:00) Central America",
+ "Central America Standard Time", "Central America Daylight Time",
+ NULL, 0
+ },
+ {
+ "Central Standard Time", 1080, true, "(UTC-06:00) Central Time (US & Canada)",
+ "Central Standard Time", "Central Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_10, 2
+ },
+ {
+ "Central Standard Time (Mexico)", 1080, true, "(UTC-06:00) Guadalajara, Mexico City, Monterrey",
+ "Central Standard Time (Mexico)", "Central Daylight Time (Mexico)",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_11, 1
+ },
+ {
+ "Canada Central Standard Time", 1080, false, "(UTC-06:00) Saskatchewan",
+ "Canada Central Standard Time", "Canada Central Daylight Time",
+ NULL, 0
+ },
+ {
+ "SA Pacific Standard Time", 1140, false, "(UTC-05:00) Bogota, Lima, Quito",
+ "SA Pacific Standard Time", "SA Pacific Daylight Time",
+ NULL, 0
+ },
+ {
+ "Eastern Standard Time", 1140, true, "(UTC-05:00) Eastern Time (US & Canada)",
+ "Eastern Standard Time", "Eastern Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_14, 2
+ },
+ {
+ "US Eastern Standard Time", 1140, true, "(UTC-05:00) Indiana (East)",
+ "US Eastern Standard Time", "US Eastern Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_15, 2
+ },
+ {
+ "Venezuela Standard Time", 1170, false, "(UTC-04:30) Caracas",
+ "Venezuela Standard Time", "Venezuela Daylight Time",
+ NULL, 0
+ },
+ {
+ "Paraguay Standard Time", 1200, true, "(UTC-04:00) Asuncion",
+ "Paraguay Standard Time", "Paraguay Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_17, 14
+ },
+ {
+ "Atlantic Standard Time", 1200, true, "(UTC-04:00) Atlantic Time (Canada)",
+ "Atlantic Standard Time", "Atlantic Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_18, 2
+ },
+ {
+ "Central Brazilian Standard Time", 1200, true, "(UTC-04:00) Cuiaba",
+ "Central Brazilian Standard Time", "Central Brazilian Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_19, 35
+ },
+ {
+ "SA Western Standard Time", 1200, false, "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan",
+ "SA Western Standard Time", "SA Western Daylight Time",
+ NULL, 0
+ },
+ {
+ "Pacific SA Standard Time", 1200, true, "(UTC-04:00) Santiago",
+ "Pacific SA Standard Time", "Pacific SA Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_21, 6
+ },
+ {
+ "Newfoundland Standard Time", 1230, true, "(UTC-03:30) Newfoundland",
+ "Newfoundland Standard Time", "Newfoundland Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_22, 7
+ },
+ {
+ "E. South America Standard Time", 1260, true, "(UTC-03:00) Brasilia",
+ "E. South America Standard Time", "E. South America Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_23, 35
+ },
+ {
+ "Argentina Standard Time", 1260, true, "(UTC-03:00) Buenos Aires",
+ "Argentina Standard Time", "Argentina Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_24, 3
+ },
+ {
+ "SA Eastern Standard Time", 1260, false, "(UTC-03:00) Cayenne, Fortaleza",
+ "SA Eastern Standard Time", "SA Eastern Daylight Time",
+ NULL, 0
+ },
+ {
+ "Greenland Standard Time", 1260, true, "(UTC-03:00) Greenland",
+ "Greenland Standard Time", "Greenland Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_26, 14
+ },
+ {
+ "Montevideo Standard Time", 1260, true, "(UTC-03:00) Montevideo",
+ "Montevideo Standard Time", "Montevideo Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_27, 2
+ },
+ {
+ "Bahia Standard Time", 1260, true, "(UTC-03:00) Salvador",
+ "Bahia Standard Time", "Bahia Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_28, 30
+ },
+ {
+ "UTC-02", 1320, false, "(UTC-02:00) Coordinated Universal Time-02",
+ "UTC-02", "UTC-02",
+ NULL, 0
+ },
+ {
+ "Mid-Atlantic Standard Time", 1320, true, "(UTC-02:00) Mid-Atlantic",
+ "Mid-Atlantic Standard Time", "Mid-Atlantic Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_30, 1
+ },
+ {
+ "Azores Standard Time", 1380, true, "(UTC-01:00) Azores",
+ "Azores Standard Time", "Azores Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_31, 1
+ },
+ {
+ "Cape Verde Standard Time", 1380, false, "(UTC-01:00) Cape Verde Is.",
+ "Cape Verde Standard Time", "Cape Verde Daylight Time",
+ NULL, 0
+ },
+ {
+ "Morocco Standard Time", 0, true, "(UTC) Casablanca",
+ "Morocco Standard Time", "Morocco Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_33, 4
+ },
+ {
+ "UTC", 0, false, "(UTC) Coordinated Universal Time",
+ "Coordinated Universal Time", "Coordinated Universal Time",
+ NULL, 0
+ },
+ {
+ "GMT Standard Time", 0, true, "(UTC) Dublin, Edinburgh, Lisbon, London",
+ "GMT Standard Time", "GMT Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_35, 1
+ },
+ {
+ "Greenwich Standard Time", 0, false, "(UTC) Monrovia, Reykjavik",
+ "Greenwich Standard Time", "Greenwich Daylight Time",
+ NULL, 0
+ },
+ {
+ "W. Europe Standard Time", 60, true, "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",
+ "W. Europe Standard Time", "W. Europe Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_37, 1
+ },
+ {
+ "Central Europe Standard Time", 60, true, "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague",
+ "Central Europe Standard Time", "Central Europe Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_38, 1
+ },
+ {
+ "Romance Standard Time", 60, true, "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris",
+ "Romance Standard Time", "Romance Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_39, 1
+ },
+ {
+ "Central European Standard Time", 60, true, "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb",
+ "Central European Standard Time", "Central European Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_40, 1
+ },
+ {
+ "W. Central Africa Standard Time", 60, false, "(UTC+01:00) West Central Africa",
+ "W. Central Africa Standard Time", "W. Central Africa Daylight Time",
+ NULL, 0
+ },
+ {
+ "Namibia Standard Time", 60, true, "(UTC+01:00) Windhoek",
+ "Namibia Standard Time", "Namibia Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_42, 2
+ },
+ {
+ "Jordan Standard Time", 120, true, "(UTC+02:00) Amman",
+ "Jordan Standard Time", "Jordan Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_43, 2
+ },
+ {
+ "GTB Standard Time", 120, true, "(UTC+02:00) Athens, Bucharest, Istanbul",
+ "GTB Standard Time", "GTB Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_44, 1
+ },
+ {
+ "Middle East Standard Time", 120, true, "(UTC+02:00) Beirut",
+ "Middle East Standard Time", "Middle East Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_45, 13
+ },
+ {
+ "Egypt Standard Time", 120, true, "(UTC+02:00) Cairo",
+ "Egypt Standard Time", "Egypt Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_46, 6
+ },
+ {
+ "Syria Standard Time", 120, true, "(UTC+02:00) Damascus",
+ "Syria Standard Time", "Syria Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_47, 12
+ },
+ {
+ "South Africa Standard Time", 120, false, "(UTC+02:00) Harare, Pretoria",
+ "South Africa Standard Time", "South Africa Daylight Time",
+ NULL, 0
+ },
+ {
+ "FLE Standard Time", 120, true, "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius",
+ "FLE Standard Time", "FLE Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_49, 1
+ },
+ {
+ "Turkey Standard Time", 120, true, "(UTC+02:00) Istanbul",
+ "Turkey Standard Time", "Turkey Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_50, 3
+ },
+ {
+ "Israel Standard Time", 120, true, "(UTC+02:00) Jerusalem",
+ "Jerusalem Standard Time", "Jerusalem Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_51, 18
+ },
+ {
+ "E. Europe Standard Time", 120, true, "(UTC+02:00) Nicosia",
+ "E. Europe Standard Time", "E. Europe Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_52, 1
+ },
+ {
+ "Arabic Standard Time", 180, true, "(UTC+03:00) Baghdad",
+ "Arabic Standard Time", "Arabic Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_53, 2
+ },
+ {
+ "Kaliningrad Standard Time", 180, true, "(UTC+03:00) Kaliningrad, Minsk",
+ "Kaliningrad Standard Time", "Kaliningrad Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_54, 1
+ },
+ {
+ "Arab Standard Time", 180, false, "(UTC+03:00) Kuwait, Riyadh",
+ "Arab Standard Time", "Arab Daylight Time",
+ NULL, 0
+ },
+ {
+ "E. Africa Standard Time", 180, false, "(UTC+03:00) Nairobi",
+ "E. Africa Standard Time", "E. Africa Daylight Time",
+ NULL, 0
+ },
+ {
+ "Iran Standard Time", 210, true, "(UTC+03:30) Tehran",
+ "Iran Standard Time", "Iran Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_57, 3
+ },
+ {
+ "Arabian Standard Time", 240, false, "(UTC+04:00) Abu Dhabi, Muscat",
+ "Arabian Standard Time", "Arabian Daylight Time",
+ NULL, 0
+ },
+ {
+ "Azerbaijan Standard Time", 240, true, "(UTC+04:00) Baku",
+ "Azerbaijan Standard Time", "Azerbaijan Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_59, 1
+ },
+ {
+ "Russian Standard Time", 240, true, "(UTC+04:00) Moscow, St. Petersburg, Volgograd",
+ "Russian Standard Time", "Russian Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_60, 1
+ },
+ {
+ "Mauritius Standard Time", 240, true, "(UTC+04:00) Port Louis",
+ "Mauritius Standard Time", "Mauritius Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_61, 2
+ },
+ {
+ "Georgian Standard Time", 240, false, "(UTC+04:00) Tbilisi",
+ "Georgian Standard Time", "Georgian Daylight Time",
+ NULL, 0
+ },
+ {
+ "Caucasus Standard Time", 240, true, "(UTC+04:00) Yerevan",
+ "Caucasus Standard Time", "Caucasus Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_63, 1
+ },
+ {
+ "Afghanistan Standard Time", 270, false, "(UTC+04:30) Kabul",
+ "Afghanistan Standard Time", "Afghanistan Daylight Time",
+ NULL, 0
+ },
+ {
+ "Pakistan Standard Time", 300, true, "(UTC+05:00) Islamabad, Karachi",
+ "Pakistan Standard Time", "Pakistan Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_65, 2
+ },
+ {
+ "West Asia Standard Time", 300, false, "(UTC+05:00) Tashkent",
+ "West Asia Standard Time", "West Asia Daylight Time",
+ NULL, 0
+ },
+ {
+ "India Standard Time", 330, false, "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi",
+ "India Standard Time", "India Daylight Time",
+ NULL, 0
+ },
+ {
+ "Sri Lanka Standard Time", 330, false, "(UTC+05:30) Sri Jayawardenepura",
+ "Sri Lanka Standard Time", "Sri Lanka Daylight Time",
+ NULL, 0
+ },
+ {
+ "Nepal Standard Time", 345, false, "(UTC+05:45) Kathmandu",
+ "Nepal Standard Time", "Nepal Daylight Time",
+ NULL, 0
+ },
+ {
+ "Central Asia Standard Time", 360, false, "(UTC+06:00) Astana",
+ "Central Asia Standard Time", "Central Asia Daylight Time",
+ NULL, 0
+ },
+ {
+ "Bangladesh Standard Time", 360, true, "(UTC+06:00) Dhaka",
+ "Bangladesh Standard Time", "Bangladesh Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_71, 1
+ },
+ {
+ "Ekaterinburg Standard Time", 360, true, "(UTC+06:00) Ekaterinburg",
+ "Ekaterinburg Standard Time", "Ekaterinburg Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_72, 1
+ },
+ {
+ "Myanmar Standard Time", 390, false, "(UTC+06:30) Yangon (Rangoon)",
+ "Myanmar Standard Time", "Myanmar Daylight Time",
+ NULL, 0
+ },
+ {
+ "SE Asia Standard Time", 420, false, "(UTC+07:00) Bangkok, Hanoi, Jakarta",
+ "SE Asia Standard Time", "SE Asia Daylight Time",
+ NULL, 0
+ },
+ {
+ "N. Central Asia Standard Time", 420, true, "(UTC+07:00) Novosibirsk",
+ "N. Central Asia Standard Time", "N. Central Asia Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_75, 1
+ },
+ {
+ "China Standard Time", 480, false, "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi",
+ "China Standard Time", "China Daylight Time",
+ NULL, 0
+ },
+ {
+ "North Asia Standard Time", 480, true, "(UTC+08:00) Krasnoyarsk",
+ "North Asia Standard Time", "North Asia Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_77, 1
+ },
+ {
+ "Singapore Standard Time", 480, false, "(UTC+08:00) Kuala Lumpur, Singapore",
+ "Malay Peninsula Standard Time", "Malay Peninsula Daylight Time",
+ NULL, 0
+ },
+ {
+ "W. Australia Standard Time", 480, true, "(UTC+08:00) Perth",
+ "W. Australia Standard Time", "W. Australia Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_79, 4
+ },
+ {
+ "Taipei Standard Time", 480, false, "(UTC+08:00) Taipei",
+ "Taipei Standard Time", "Taipei Daylight Time",
+ NULL, 0
+ },
+ {
+ "Ulaanbaatar Standard Time", 480, false, "(UTC+08:00) Ulaanbaatar",
+ "Ulaanbaatar Standard Time", "Ulaanbaatar Daylight Time",
+ NULL, 0
+ },
+ {
+ "North Asia East Standard Time", 540, true, "(UTC+09:00) Irkutsk",
+ "North Asia East Standard Time", "North Asia East Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_82, 1
+ },
+ {
+ "Tokyo Standard Time", 540, false, "(UTC+09:00) Osaka, Sapporo, Tokyo",
+ "Tokyo Standard Time", "Tokyo Daylight Time",
+ NULL, 0
+ },
+ {
+ "Korea Standard Time", 540, false, "(UTC+09:00) Seoul",
+ "Korea Standard Time", "Korea Daylight Time",
+ NULL, 0
+ },
+ {
+ "Cen. Australia Standard Time", 570, true, "(UTC+09:30) Adelaide",
+ "Cen. Australia Standard Time", "Cen. Australia Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_85, 2
+ },
+ {
+ "AUS Central Standard Time", 570, false, "(UTC+09:30) Darwin",
+ "AUS Central Standard Time", "AUS Central Daylight Time",
+ NULL, 0
+ },
+ {
+ "E. Australia Standard Time", 600, false, "(UTC+10:00) Brisbane",
+ "E. Australia Standard Time", "E. Australia Daylight Time",
+ NULL, 0
+ },
+ {
+ "AUS Eastern Standard Time", 600, true, "(UTC+10:00) Canberra, Melbourne, Sydney",
+ "AUS Eastern Standard Time", "AUS Eastern Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_88, 2
+ },
+ {
+ "West Pacific Standard Time", 600, false, "(UTC+10:00) Guam, Port Moresby",
+ "West Pacific Standard Time", "West Pacific Daylight Time",
+ NULL, 0
+ },
+ {
+ "Tasmania Standard Time", 600, true, "(UTC+10:00) Hobart",
+ "Tasmania Standard Time", "Tasmania Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_90, 2
+ },
+ {
+ "Yakutsk Standard Time", 600, true, "(UTC+10:00) Yakutsk",
+ "Yakutsk Standard Time", "Yakutsk Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_91, 1
+ },
+ {
+ "Central Pacific Standard Time", 660, false, "(UTC+11:00) Solomon Is., New Caledonia",
+ "Central Pacific Standard Time", "Central Pacific Daylight Time",
+ NULL, 0
+ },
+ {
+ "Vladivostok Standard Time", 660, true, "(UTC+11:00) Vladivostok",
+ "Vladivostok Standard Time", "Vladivostok Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_93, 1
+ },
+ {
+ "New Zealand Standard Time", 720, true, "(UTC+12:00) Auckland, Wellington",
+ "New Zealand Standard Time", "New Zealand Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_94, 3
+ },
+ {
+ "UTC+12", 720, false, "(UTC+12:00) Coordinated Universal Time+12",
+ "UTC+12", "UTC+12",
+ NULL, 0
+ },
+ {
+ "Fiji Standard Time", 720, true, "(UTC+12:00) Fiji",
+ "Fiji Standard Time", "Fiji Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_96, 5
+ },
+ {
+ "Magadan Standard Time", 720, true, "(UTC+12:00) Magadan",
+ "Magadan Standard Time", "Magadan Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_97, 1
+ },
+ {
+ "Kamchatka Standard Time", 720, true, "(UTC+12:00) Petropavlovsk-Kamchatsky - Old",
+ "Kamchatka Standard Time", "Kamchatka Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_98, 1
+ },
+ {
+ "Tonga Standard Time", 780, false, "(UTC+13:00) Nuku'alofa",
+ "Tonga Standard Time", "Tonga Daylight Time",
+ NULL, 0
+ },
+ {
+ "Samoa Standard Time", 780, true, "(UTC+13:00) Samoa",
+ "Samoa Standard Time", "Samoa Daylight Time",
+ (TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_100, 2
+ }
+};
+
+/* Table generated with WindowsZones.cs */
+
+struct _WINDOWS_TZID_ENTRY
+{
+ const char* windows;
+ const char* tzid;
+};
+typedef struct _WINDOWS_TZID_ENTRY WINDOWS_TZID_ENTRY;
+
+const WINDOWS_TZID_ENTRY WindowsTimeZoneIdTable[] =
+{
+ { "Afghanistan Standard Time", "Asia/Kabul" },
+ { "Alaskan Standard Time", "America/Anchorage America/Juneau "
+ "America/Nome America/Sitka America/Yakutat" },
+ { "Alaskan Standard Time", "America/Anchorage" },
+ { "Arab Standard Time", "Asia/Aden" },
+ { "Arab Standard Time", "Asia/Bahrain" },
+ { "Arab Standard Time", "Asia/Kuwait" },
+ { "Arab Standard Time", "Asia/Qatar" },
+ { "Arab Standard Time", "Asia/Riyadh" },
+ { "Arabian Standard Time", "Asia/Dubai" },
+ { "Arabian Standard Time", "Asia/Muscat" },
+ { "Arabian Standard Time", "Etc/GMT-4" },
+ { "Arabic Standard Time", "Asia/Baghdad" },
+ { "Argentina Standard Time", "America/Buenos_Aires America/Argentina/La_Rioja "
+ "America/Argentina/Rio_Gallegos America/Argentina/Salta "
+ "America/Argentina/San_Juan America/Argentina/San_Luis "
+ "America/Argentina/Tucuman America/Argentina/Ushuaia America/Catamarca "
+ "America/Cordoba America/Jujuy America/Mendoza" },
+ { "Argentina Standard Time", "America/Buenos_Aires" },
+ { "Atlantic Standard Time", "America/Halifax America/Glace_Bay "
+ "America/Goose_Bay America/Moncton" },
+ { "Atlantic Standard Time", "America/Halifax" },
+ { "Atlantic Standard Time", "America/Thule" },
+ { "Atlantic Standard Time", "Atlantic/Bermuda" },
+ { "AUS Central Standard Time", "Australia/Darwin" },
+ { "AUS Eastern Standard Time", "Australia/Sydney Australia/Melbourne" },
+ { "AUS Eastern Standard Time", "Australia/Sydney" },
+ { "Azerbaijan Standard Time", "Asia/Baku" },
+ { "Azores Standard Time", "America/Scoresbysund" },
+ { "Azores Standard Time", "Atlantic/Azores" },
+ { "Bahia Standard Time", "America/Bahia" },
+ { "Bangladesh Standard Time", "Asia/Dhaka" },
+ { "Bangladesh Standard Time", "Asia/Thimphu" },
+ { "Canada Central Standard Time", "America/Regina America/Swift_Current" },
+ { "Canada Central Standard Time", "America/Regina" },
+ { "Cape Verde Standard Time", "Atlantic/Cape_Verde" },
+ { "Cape Verde Standard Time", "Etc/GMT+1" },
+ { "Caucasus Standard Time", "Asia/Yerevan" },
+ { "Cen. Australia Standard Time", "Australia/Adelaide Australia/Broken_Hill" },
+ { "Cen. Australia Standard Time", "Australia/Adelaide" },
+ { "Central America Standard Time", "America/Belize" },
+ { "Central America Standard Time", "America/Costa_Rica" },
+ { "Central America Standard Time", "America/El_Salvador" },
+ { "Central America Standard Time", "America/Guatemala" },
+ { "Central America Standard Time", "America/Managua" },
+ { "Central America Standard Time", "America/Tegucigalpa" },
+ { "Central America Standard Time", "Etc/GMT+6" },
+ { "Central America Standard Time", "Pacific/Galapagos" },
+ { "Central Asia Standard Time", "Antarctica/Vostok" },
+ { "Central Asia Standard Time", "Asia/Almaty Asia/Qyzylorda" },
+ { "Central Asia Standard Time", "Asia/Almaty" },
+ { "Central Asia Standard Time", "Asia/Bishkek" },
+ { "Central Asia Standard Time", "Etc/GMT-6" },
+ { "Central Asia Standard Time", "Indian/Chagos" },
+ { "Central Brazilian Standard Time", "America/Cuiaba America/Campo_Grande" },
+ { "Central Brazilian Standard Time", "America/Cuiaba" },
+ { "Central Europe Standard Time", "Europe/Belgrade" },
+ { "Central Europe Standard Time", "Europe/Bratislava" },
+ { "Central Europe Standard Time", "Europe/Budapest" },
+ { "Central Europe Standard Time", "Europe/Ljubljana" },
+ { "Central Europe Standard Time", "Europe/Podgorica" },
+ { "Central Europe Standard Time", "Europe/Prague" },
+ { "Central Europe Standard Time", "Europe/Tirane" },
+ { "Central European Standard Time", "Europe/Sarajevo" },
+ { "Central European Standard Time", "Europe/Skopje" },
+ { "Central European Standard Time", "Europe/Warsaw" },
+ { "Central European Standard Time", "Europe/Zagreb" },
+ { "Central Pacific Standard Time", "Antarctica/Macquarie" },
+ { "Central Pacific Standard Time", "Etc/GMT-11" },
+ { "Central Pacific Standard Time", "Pacific/Efate" },
+ { "Central Pacific Standard Time", "Pacific/Guadalcanal" },
+ { "Central Pacific Standard Time", "Pacific/Noumea" },
+ { "Central Pacific Standard Time", "Pacific/Ponape Pacific/Kosrae" },
+ { "Central Standard Time (Mexico)", "America/Mexico_City America/Bahia_Banderas "
+ "America/Cancun America/Merida America/Monterrey" },
+ { "Central Standard Time (Mexico)", "America/Mexico_City" },
+ { "Central Standard Time", "America/Chicago America/Indiana/Knox "
+ "America/Indiana/Tell_City America/Menominee "
+ "America/North_Dakota/Beulah America/North_Dakota/Center "
+ "America/North_Dakota/New_Salem" },
+ { "Central Standard Time", "America/Chicago" },
+ { "Central Standard Time", "America/Matamoros" },
+ { "Central Standard Time", "America/Winnipeg America/Rainy_River "
+ "America/Rankin_Inlet America/Resolute" },
+ { "Central Standard Time", "CST6CDT" },
+ { "China Standard Time", "Asia/Hong_Kong" },
+ { "China Standard Time", "Asia/Macau" },
+ { "China Standard Time", "Asia/Shanghai Asia/Chongqing Asia/Harbin Asia/Kashgar Asia/Urumqi" },
+ { "China Standard Time", "Asia/Shanghai" },
+ { "Dateline Standard Time", "Etc/GMT+12" },
+ { "E. Africa Standard Time", "Africa/Addis_Ababa" },
+ { "E. Africa Standard Time", "Africa/Asmera" },
+ { "E. Africa Standard Time", "Africa/Dar_es_Salaam" },
+ { "E. Africa Standard Time", "Africa/Djibouti" },
+ { "E. Africa Standard Time", "Africa/Juba" },
+ { "E. Africa Standard Time", "Africa/Kampala" },
+ { "E. Africa Standard Time", "Africa/Khartoum" },
+ { "E. Africa Standard Time", "Africa/Mogadishu" },
+ { "E. Africa Standard Time", "Africa/Nairobi" },
+ { "E. Africa Standard Time", "Antarctica/Syowa" },
+ { "E. Africa Standard Time", "Etc/GMT-3" },
+ { "E. Africa Standard Time", "Indian/Antananarivo" },
+ { "E. Africa Standard Time", "Indian/Comoro" },
+ { "E. Africa Standard Time", "Indian/Mayotte" },
+ { "E. Australia Standard Time", "Australia/Brisbane Australia/Lindeman" },
+ { "E. Australia Standard Time", "Australia/Brisbane" },
+ { "E. Europe Standard Time", "Asia/Nicosia" },
+ { "E. South America Standard Time", "America/Sao_Paulo" },
+ { "Eastern Standard Time", "America/Grand_Turk" },
+ { "Eastern Standard Time", "America/Nassau" },
+ { "Eastern Standard Time", "America/New_York America/Detroit "
+ "America/Indiana/Petersburg America/Indiana/Vincennes "
+ "America/Indiana/Winamac America/Kentucky/Monticello America/Louisville" },
+ { "Eastern Standard Time", "America/New_York" },
+ { "Eastern Standard Time", "America/Toronto America/Iqaluit America/Montreal "
+ "America/Nipigon America/Pangnirtung America/Thunder_Bay" },
+ { "Eastern Standard Time", "EST5EDT" },
+ { "Egypt Standard Time", "Africa/Cairo" },
+ { "Egypt Standard Time", "Asia/Gaza Asia/Hebron" },
+ { "Ekaterinburg Standard Time", "Asia/Yekaterinburg" },
+ { "Fiji Standard Time", "Pacific/Fiji" },
+ { "FLE Standard Time", "Europe/Helsinki" },
+ { "FLE Standard Time", "Europe/Kiev Europe/Simferopol Europe/Uzhgorod Europe/Zaporozhye" },
+ { "FLE Standard Time", "Europe/Kiev" },
+ { "FLE Standard Time", "Europe/Mariehamn" },
+ { "FLE Standard Time", "Europe/Riga" },
+ { "FLE Standard Time", "Europe/Sofia" },
+ { "FLE Standard Time", "Europe/Tallinn" },
+ { "FLE Standard Time", "Europe/Vilnius" },
+ { "Georgian Standard Time", "Asia/Tbilisi" },
+ { "GMT Standard Time", "Atlantic/Canary" },
+ { "GMT Standard Time", "Atlantic/Faeroe" },
+ { "GMT Standard Time", "Europe/Dublin" },
+ { "GMT Standard Time", "Europe/Guernsey" },
+ { "GMT Standard Time", "Europe/Isle_of_Man" },
+ { "GMT Standard Time", "Europe/Jersey" },
+ { "GMT Standard Time", "Europe/Lisbon Atlantic/Madeira" },
+ { "GMT Standard Time", "Europe/London" },
+ { "Greenland Standard Time", "America/Godthab" },
+ { "Greenwich Standard Time", "Africa/Abidjan" },
+ { "Greenwich Standard Time", "Africa/Accra" },
+ { "Greenwich Standard Time", "Africa/Bamako" },
+ { "Greenwich Standard Time", "Africa/Banjul" },
+ { "Greenwich Standard Time", "Africa/Bissau" },
+ { "Greenwich Standard Time", "Africa/Conakry" },
+ { "Greenwich Standard Time", "Africa/Dakar" },
+ { "Greenwich Standard Time", "Africa/El_Aaiun" },
+ { "Greenwich Standard Time", "Africa/Freetown" },
+ { "Greenwich Standard Time", "Africa/Lome" },
+ { "Greenwich Standard Time", "Africa/Monrovia" },
+ { "Greenwich Standard Time", "Africa/Nouakchott" },
+ { "Greenwich Standard Time", "Africa/Ouagadougou" },
+ { "Greenwich Standard Time", "Africa/Sao_Tome" },
+ { "Greenwich Standard Time", "Atlantic/Reykjavik" },
+ { "Greenwich Standard Time", "Atlantic/St_Helena" },
+ { "GTB Standard Time", "Europe/Athens" },
+ { "GTB Standard Time", "Europe/Bucharest" },
+ { "GTB Standard Time", "Europe/Chisinau" },
+ { "GTB Standard Time", "Europe/Istanbul" },
+ { "Hawaiian Standard Time", "Etc/GMT+10" },
+ { "Hawaiian Standard Time", "Pacific/Fakaofo" },
+ { "Hawaiian Standard Time", "Pacific/Honolulu" },
+ { "Hawaiian Standard Time", "Pacific/Johnston" },
+ { "Hawaiian Standard Time", "Pacific/Rarotonga" },
+ { "Hawaiian Standard Time", "Pacific/Tahiti" },
+ { "India Standard Time", "Asia/Calcutta Asia/Kolkata" },
+ { "Iran Standard Time", "Asia/Tehran" },
+ { "Israel Standard Time", "Asia/Jerusalem" },
+ { "Jordan Standard Time", "Asia/Amman" },
+ { "Kaliningrad Standard Time", "Europe/Kaliningrad" },
+ { "Kaliningrad Standard Time", "Europe/Minsk" },
+ { "Korea Standard Time", "Asia/Pyongyang" },
+ { "Korea Standard Time", "Asia/Seoul" },
+ { "Magadan Standard Time", "Asia/Magadan Asia/Anadyr Asia/Kamchatka" },
+ { "Magadan Standard Time", "Asia/Magadan" },
+ { "Mauritius Standard Time", "Indian/Mahe" },
+ { "Mauritius Standard Time", "Indian/Mauritius" },
+ { "Mauritius Standard Time", "Indian/Reunion" },
+ { "Middle East Standard Time", "Asia/Beirut" },
+ { "Montevideo Standard Time", "America/Montevideo" },
+ { "Morocco Standard Time", "Africa/Casablanca" },
+ { "Mountain Standard Time (Mexico)", "America/Chihuahua America/Mazatlan" },
+ { "Mountain Standard Time (Mexico)", "America/Chihuahua" },
+ { "Mountain Standard Time", "America/Denver America/Boise America/Shiprock" },
+ { "Mountain Standard Time", "America/Denver" },
+ { "Mountain Standard Time", "America/Edmonton "
+ "America/Cambridge_Bay America/Inuvik America/Yellowknife" },
+ { "Mountain Standard Time", "America/Ojinaga" },
+ { "Mountain Standard Time", "MST7MDT" },
+ { "Myanmar Standard Time", "Asia/Rangoon" },
+ { "Myanmar Standard Time", "Indian/Cocos" },
+ { "N. Central Asia Standard Time", "Asia/Novosibirsk Asia/Novokuznetsk Asia/Omsk" },
+ { "N. Central Asia Standard Time", "Asia/Novosibirsk" },
+ { "Namibia Standard Time", "Africa/Windhoek" },
+ { "Nepal Standard Time", "Asia/Katmandu Asia/Kathmandu" },
+ { "New Zealand Standard Time", "Antarctica/South_Pole Antarctica/McMurdo" },
+ { "New Zealand Standard Time", "Pacific/Auckland" },
+ { "Newfoundland Standard Time", "America/St_Johns" },
+ { "North Asia East Standard Time", "Asia/Irkutsk" },
+ { "North Asia Standard Time", "Asia/Krasnoyarsk" },
+ { "Pacific SA Standard Time", "America/Santiago" },
+ { "Pacific SA Standard Time", "Antarctica/Palmer" },
+ { "Pacific Standard Time (Mexico)", "America/Santa_Isabel" },
+ { "Pacific Standard Time", "America/Los_Angeles" },
+ { "Pacific Standard Time", "America/Tijuana America/Ensenada" },
+ { "Pacific Standard Time", "America/Vancouver America/Dawson America/Whitehorse" },
+ { "Pacific Standard Time", "PST8PDT" },
+ { "Pakistan Standard Time", "Asia/Karachi" },
+ { "Paraguay Standard Time", "America/Asuncion" },
+ { "Romance Standard Time", "Europe/Brussels" },
+ { "Romance Standard Time", "Europe/Copenhagen" },
+ { "Romance Standard Time", "Europe/Madrid Africa/Ceuta" },
+ { "Romance Standard Time", "Europe/Paris" },
+ { "Russian Standard Time", "Europe/Moscow Europe/Samara Europe/Volgograd" },
+ { "Russian Standard Time", "Europe/Moscow" },
+ { "SA Eastern Standard Time", "America/Cayenne" },
+ { "SA Eastern Standard Time", "America/Fortaleza America/Araguaina "
+ "America/Belem America/Maceio America/Recife America/Santarem" },
+ { "SA Eastern Standard Time", "America/Paramaribo" },
+ { "SA Eastern Standard Time", "Antarctica/Rothera" },
+ { "SA Eastern Standard Time", "Etc/GMT+3" },
+ { "SA Pacific Standard Time", "America/Bogota" },
+ { "SA Pacific Standard Time", "America/Cayman" },
+ { "SA Pacific Standard Time", "America/Coral_Harbour" },
+ { "SA Pacific Standard Time", "America/Guayaquil" },
+ { "SA Pacific Standard Time", "America/Jamaica" },
+ { "SA Pacific Standard Time", "America/Lima" },
+ { "SA Pacific Standard Time", "America/Panama" },
+ { "SA Pacific Standard Time", "America/Port-au-Prince" },
+ { "SA Pacific Standard Time", "Etc/GMT+5" },
+ { "SA Western Standard Time", "America/Anguilla" },
+ { "SA Western Standard Time", "America/Antigua" },
+ { "SA Western Standard Time", "America/Aruba" },
+ { "SA Western Standard Time", "America/Barbados" },
+ { "SA Western Standard Time", "America/Blanc-Sablon" },
+ { "SA Western Standard Time", "America/Curacao" },
+ { "SA Western Standard Time", "America/Dominica" },
+ { "SA Western Standard Time", "America/Grenada" },
+ { "SA Western Standard Time", "America/Guadeloupe" },
+ { "SA Western Standard Time", "America/Guyana" },
+ { "SA Western Standard Time", "America/La_Paz" },
+ { "SA Western Standard Time", "America/Manaus America/Boa_Vista "
+ "America/Eirunepe America/Porto_Velho America/Rio_Branco" },
+ { "SA Western Standard Time", "America/Marigot" },
+ { "SA Western Standard Time", "America/Martinique" },
+ { "SA Western Standard Time", "America/Montserrat" },
+ { "SA Western Standard Time", "America/Port_of_Spain" },
+ { "SA Western Standard Time", "America/Puerto_Rico" },
+ { "SA Western Standard Time", "America/Santo_Domingo" },
+ { "SA Western Standard Time", "America/St_Barthelemy" },
+ { "SA Western Standard Time", "America/St_Kitts" },
+ { "SA Western Standard Time", "America/St_Lucia" },
+ { "SA Western Standard Time", "America/St_Thomas" },
+ { "SA Western Standard Time", "America/St_Vincent" },
+ { "SA Western Standard Time", "America/Tortola" },
+ { "SA Western Standard Time", "Etc/GMT+4" },
+ { "Samoa Standard Time", "Pacific/Apia Pacific/Samoa" },
+ { "SE Asia Standard Time", "Antarctica/Davis" },
+ { "SE Asia Standard Time", "Asia/Bangkok" },
+ { "SE Asia Standard Time", "Asia/Hovd" },
+ { "SE Asia Standard Time", "Asia/Jakarta Asia/Pontianak" },
+ { "SE Asia Standard Time", "Asia/Phnom_Penh" },
+ { "SE Asia Standard Time", "Asia/Saigon Asia/Ho_Chi_Minh" },
+ { "SE Asia Standard Time", "Asia/Vientiane" },
+ { "SE Asia Standard Time", "Etc/GMT-7" },
+ { "SE Asia Standard Time", "Indian/Christmas" },
+ { "Singapore Standard Time", "Asia/Brunei" },
+ { "Singapore Standard Time", "Asia/Kuala_Lumpur Asia/Kuching" },
+ { "Singapore Standard Time", "Asia/Makassar" },
+ { "Singapore Standard Time", "Asia/Manila" },
+ { "Singapore Standard Time", "Asia/Singapore" },
+ { "Singapore Standard Time", "Etc/GMT-8" },
+ { "South Africa Standard Time", "Africa/Blantyre" },
+ { "South Africa Standard Time", "Africa/Bujumbura" },
+ { "South Africa Standard Time", "Africa/Gaborone" },
+ { "South Africa Standard Time", "Africa/Harare" },
+ { "South Africa Standard Time", "Africa/Johannesburg" },
+ { "South Africa Standard Time", "Africa/Kigali" },
+ { "South Africa Standard Time", "Africa/Lubumbashi" },
+ { "South Africa Standard Time", "Africa/Lusaka" },
+ { "South Africa Standard Time", "Africa/Maputo" },
+ { "South Africa Standard Time", "Africa/Maseru" },
+ { "South Africa Standard Time", "Africa/Mbabane" },
+ { "South Africa Standard Time", "Africa/Tripoli" },
+ { "South Africa Standard Time", "Etc/GMT-2" },
+ { "Sri Lanka Standard Time", "Asia/Colombo" },
+ { "Syria Standard Time", "Asia/Damascus" },
+ { "Taipei Standard Time", "Asia/Taipei" },
+ { "Tasmania Standard Time", "Australia/Hobart Australia/Currie" },
+ { "Tasmania Standard Time", "Australia/Hobart" },
+ { "Tokyo Standard Time", "Asia/Dili" },
+ { "Tokyo Standard Time", "Asia/Jayapura" },
+ { "Tokyo Standard Time", "Asia/Tokyo" },
+ { "Tokyo Standard Time", "Etc/GMT-9" },
+ { "Tokyo Standard Time", "Pacific/Palau" },
+ { "Tonga Standard Time", "Etc/GMT-13" },
+ { "Tonga Standard Time", "Pacific/Enderbury" },
+ { "Tonga Standard Time", "Pacific/Tongatapu" },
+ /* { "Turkey Standard Time", "Europe/Istanbul" }, */
+ { "Ulaanbaatar Standard Time", "Asia/Ulaanbaatar Asia/Choibalsan" },
+ { "Ulaanbaatar Standard Time", "Asia/Ulaanbaatar" },
+ { "US Eastern Standard Time", "America/Indianapolis "
+ "America/Indiana/Marengo America/Indiana/Vevay" },
+ { "US Eastern Standard Time", "America/Indianapolis" },
+ { "US Mountain Standard Time", "America/Dawson_Creek" },
+ { "US Mountain Standard Time", "America/Hermosillo" },
+ { "US Mountain Standard Time", "America/Phoenix" },
+ { "US Mountain Standard Time", "Etc/GMT+7" },
+ { "UTC", "America/Danmarkshavn" },
+ { "UTC", "Etc/GMT" },
+ { "UTC+12", "Etc/GMT-12" },
+ { "UTC+12", "Pacific/Funafuti" },
+ { "UTC+12", "Pacific/Majuro Pacific/Kwajalein" },
+ { "UTC+12", "Pacific/Nauru" },
+ { "UTC+12", "Pacific/Tarawa" },
+ { "UTC+12", "Pacific/Wake" },
+ { "UTC+12", "Pacific/Wallis" },
+ { "UTC-02", "America/Noronha" },
+ { "UTC-02", "Atlantic/South_Georgia" },
+ { "UTC-02", "Etc/GMT+2" },
+ { "UTC-11", "Etc/GMT+11" },
+ { "UTC-11", "Pacific/Midway" },
+ { "UTC-11", "Pacific/Niue" },
+ { "UTC-11", "Pacific/Pago_Pago" },
+ { "Venezuela Standard Time", "America/Caracas" },
+ { "Vladivostok Standard Time", "Asia/Vladivostok Asia/Sakhalin" },
+ { "Vladivostok Standard Time", "Asia/Vladivostok" },
+ { "W. Australia Standard Time", "Antarctica/Casey" },
+ { "W. Australia Standard Time", "Australia/Perth" },
+ { "W. Central Africa Standard Time", "Africa/Algiers" },
+ { "W. Central Africa Standard Time", "Africa/Bangui" },
+ { "W. Central Africa Standard Time", "Africa/Brazzaville" },
+ { "W. Central Africa Standard Time", "Africa/Douala" },
+ { "W. Central Africa Standard Time", "Africa/Kinshasa" },
+ { "W. Central Africa Standard Time", "Africa/Lagos" },
+ { "W. Central Africa Standard Time", "Africa/Libreville" },
+ { "W. Central Africa Standard Time", "Africa/Luanda" },
+ { "W. Central Africa Standard Time", "Africa/Malabo" },
+ { "W. Central Africa Standard Time", "Africa/Ndjamena" },
+ { "W. Central Africa Standard Time", "Africa/Niamey" },
+ { "W. Central Africa Standard Time", "Africa/Porto-Novo" },
+ { "W. Central Africa Standard Time", "Africa/Tunis" },
+ { "W. Central Africa Standard Time", "Etc/GMT-1" },
+ { "W. Europe Standard Time", "Arctic/Longyearbyen" },
+ { "W. Europe Standard Time", "Europe/Amsterdam" },
+ { "W. Europe Standard Time", "Europe/Andorra" },
+ { "W. Europe Standard Time", "Europe/Berlin" },
+ { "W. Europe Standard Time", "Europe/Gibraltar" },
+ { "W. Europe Standard Time", "Europe/Luxembourg" },
+ { "W. Europe Standard Time", "Europe/Malta" },
+ { "W. Europe Standard Time", "Europe/Monaco" },
+ { "W. Europe Standard Time", "Europe/Oslo" },
+ { "W. Europe Standard Time", "Europe/Rome" },
+ { "W. Europe Standard Time", "Europe/San_Marino" },
+ { "W. Europe Standard Time", "Europe/Stockholm" },
+ { "W. Europe Standard Time", "Europe/Vaduz" },
+ { "W. Europe Standard Time", "Europe/Vatican" },
+ { "W. Europe Standard Time", "Europe/Vienna" },
+ { "W. Europe Standard Time", "Europe/Zurich" },
+ { "West Asia Standard Time", "Antarctica/Mawson" },
+ { "West Asia Standard Time", "Asia/Ashgabat" },
+ { "West Asia Standard Time", "Asia/Dushanbe" },
+ { "West Asia Standard Time", "Asia/Oral Asia/Aqtau Asia/Aqtobe" },
+ { "West Asia Standard Time", "Asia/Tashkent Asia/Samarkand" },
+ { "West Asia Standard Time", "Asia/Tashkent" },
+ { "West Asia Standard Time", "Etc/GMT-5" },
+ { "West Asia Standard Time", "Indian/Kerguelen" },
+ { "West Asia Standard Time", "Indian/Maldives" },
+ { "West Pacific Standard Time", "Antarctica/DumontDUrville" },
+ { "West Pacific Standard Time", "Etc/GMT-10" },
+ { "West Pacific Standard Time", "Pacific/Guam" },
+ { "West Pacific Standard Time", "Pacific/Port_Moresby" },
+ { "West Pacific Standard Time", "Pacific/Saipan" },
+ { "West Pacific Standard Time", "Pacific/Truk" },
+ { "Yakutsk Standard Time", "Asia/Yakutsk" }
+};
+
+/**
+ * Read SYSTEM_TIME structure (TS_SYSTEMTIME).\n
+ * @msdn{cc240478}
+ * @param s stream
+ * @param system_time system time structure
+ */
+
+void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time)
+{
+ stream_read_uint16(s, system_time->wYear); /* wYear, must be set to 0 */
+ stream_read_uint16(s, system_time->wMonth); /* wMonth */
+ stream_read_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */
+ stream_read_uint16(s, system_time->wDay); /* wDay */
+ stream_read_uint16(s, system_time->wHour); /* wHour */
+ stream_read_uint16(s, system_time->wMinute); /* wMinute */
+ stream_read_uint16(s, system_time->wSecond); /* wSecond */
+ stream_read_uint16(s, system_time->wMilliseconds); /* wMilliseconds */
+}
+
+/**
+ * Write SYSTEM_TIME structure (TS_SYSTEMTIME).\n
+ * @msdn{cc240478}
+ * @param s stream
+ * @param system_time system time structure
+ */
+
+void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time)
+{
+ stream_write_uint16(s, system_time->wYear); /* wYear, must be set to 0 */
+ stream_write_uint16(s, system_time->wMonth); /* wMonth */
+ stream_write_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */
+ stream_write_uint16(s, system_time->wDay); /* wDay */
+ stream_write_uint16(s, system_time->wHour); /* wHour */
+ stream_write_uint16(s, system_time->wMinute); /* wMinute */
+ stream_write_uint16(s, system_time->wSecond); /* wSecond */
+ stream_write_uint16(s, system_time->wMilliseconds); /* wMilliseconds */
+ DEBUG_TIMEZONE("Time: y=%d,m=%d,dow=%d,d=%d, %02d:%02d:%02d.%03d",
+ system_time->wYear, system_time->wMonth, system_time->wDayOfWeek,
+ system_time->wDay, system_time->wHour, system_time->wMinute,
+ system_time->wSecond, system_time->wMilliseconds);
+}
+
+char* rdp_get_unix_timezone_identifier()
+{
+ FILE* fp;
+ ssize_t len;
+ char* tz_env;
+ size_t length;
+ char* tzid = NULL;
+ char buf[1024];
+
+ tz_env = getenv("TZ");
+
+ if (tz_env != NULL)
+ {
+ tzid = xstrdup(tz_env);
+ return tzid;
+ }
+
+ fp = fopen("/etc/timezone", "r");
+
+ if (fp != NULL)
+ {
+ fseek(fp, 0, SEEK_END);
+ length = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ if (length < 2)
+ {
+ fclose(fp);
+ return NULL;
+ }
+
+ tzid = (char*) xmalloc(length + 1);
+ fread(tzid, length, 1, fp);
+ tzid[length] = '\0';
+
+ if (tzid[length - 1] == '\n')
+ tzid[length - 1] = '\0';
+
+ fclose(fp);
+
+ return tzid;
+ }
+
+ /* On linux distros such as Redhat or Archlinux, a symlink at /etc/localtime
+ * will point to /usr/share/zoneinfo/region/place where region/place could be
+ * America/Montreal for example.
+ */
+
+ if ((len = readlink("/etc/localtime", buf, sizeof(buf)-1)) != -1)
+ {
+ int num = 0;
+ int pos = len;
+
+ buf[len] = '\0';
+
+ /* find the position of the 2nd to last "/" */
+
+ while(num < 2)
+ {
+ if(pos == 0)
+ break;
+
+ pos -= 1;
+
+ if(buf[pos] == '/')
+ num++;
+ }
+
+ tzid = (char*) xmalloc(len - pos + 1);
+ strncpy(tzid, buf+pos+1, len - pos);
+
+ return tzid;
+ }
+
+ printf("Unable to detect time zone\n");
+ return tzid;
+}
+
+boolean match_unix_timezone_identifier_with_list(const char* tzid, const char* list)
+{
+ char* p;
+ char* list_copy;
+
+ list_copy = xstrdup(list);
+
+ p = strtok(list_copy, " ");
+
+ while (p != NULL)
+ {
+ if (strcmp(p, tzid) == 0)
+ {
+ xfree(list_copy);
+ return true;
+ }
+
+ p = strtok(NULL, " ");
+ }
+
+ xfree(list_copy);
+
+ return false;
+}
+
+TIME_ZONE_ENTRY* rdp_detect_windows_time_zone(uint32 bias)
+{
+ int i, j;
+ char* tzid;
+ TIME_ZONE_ENTRY* timezone;
+
+ tzid = rdp_get_unix_timezone_identifier();
+
+ if (tzid == NULL)
+ return NULL;
+
+ for (i = 0; i < ARRAY_SIZE(TimeZoneTable); i++)
+ {
+ for (j = 0; j < ARRAY_SIZE(WindowsTimeZoneIdTable); j++)
+ {
+ if (strcmp(TimeZoneTable[i].Id, WindowsTimeZoneIdTable[j].windows) != 0)
+ continue;
+
+ if (match_unix_timezone_identifier_with_list(tzid, WindowsTimeZoneIdTable[j].tzid))
+ {
+ timezone = (TIME_ZONE_ENTRY*) xmalloc(sizeof(TIME_ZONE_ENTRY));
+ memcpy((void*) timezone, (void*) &TimeZoneTable[i], sizeof(TIME_ZONE_ENTRY));
+ timezone->Bias = bias;
+ xfree(tzid);
+ return timezone;
+ }
+ }
+ }
+
+ printf("Unable to find a match for unix timezone: %s\n", tzid);
+ xfree(tzid);
+ return NULL;
+}
+
+TIME_ZONE_RULE_ENTRY* rdp_get_current_time_zone_rule(TIME_ZONE_RULE_ENTRY* rules, uint32 count)
+{
+ int i;
+ uint64 windows_time;
+
+ windows_time = rdp_windows_gmtime();
+
+ for (i = 0; i < (int) count; i++)
+ {
+ if ((rules[i].TicksStart >= windows_time) && (windows_time >= rules[i].TicksEnd))
+ {
+ /*printf("Got rule %d from table at %p with count %u\n", i, rules, count);*/
+ return &rules[i];
+ }
+ }
+
+ fprintf(stderr, "Unable to get current timezone rule\n");
+ return NULL;
+}
+
+/**
+ * Get client time zone information.\n
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings)
+{
+ time_t t;
+ TIME_ZONE_ENTRY* tz;
+ TIME_ZONE_INFO* clientTimeZone;
+ struct tm* local_time;
+
+ clientTimeZone = settings->client_time_zone;
+
+ clientTimeZone->standardBias = 0;
+
+ time(&t);
+ local_time = localtime(&t);
+
+#ifdef HAVE_TM_GMTOFF
+ clientTimeZone->bias = timezone / 60;
+ DEBUG_TIMEZONE("tzname[std]: %s, tzname[dst]: %s, timezone: %ld, Daylight: %d", tzname[0], tzname[1], timezone, daylight);
+#elif sun
+ if (local_time->tm_isdst > 0)
+ clientTimeZone->bias = (uint32) (altzone / 3600);
+ else
+ clientTimeZone->bias = (uint32) (timezone / 3600);
+#else
+ clientTimeZone->bias = 0;
+#endif
+
+ tz = rdp_detect_windows_time_zone(clientTimeZone->bias);
+
+ if (tz != NULL)
+ {
+ DEBUG_TIMEZONE("tz: Id='%s' Bias=%d DST=%d dn='%s' sn='%s' dln='%s'",
+ tz->Id, tz->Bias, tz->SupportsDST, tz->DisplayName,
+ tz->StandardName, tz->DaylightName);
+
+ sprintf(clientTimeZone->standardName, "%s", tz->StandardName);
+ sprintf(clientTimeZone->daylightName, "%s", tz->DaylightName);
+
+ if ((tz->SupportsDST) && (tz->RuleTableCount > 0))
+ {
+ TIME_ZONE_RULE_ENTRY* rule;
+ rule = rdp_get_current_time_zone_rule(tz->RuleTable, tz->RuleTableCount);
+
+ if (rule != NULL)
+ {
+ clientTimeZone->daylightBias = -rule->DaylightDelta;
+
+ clientTimeZone->standardDate.wYear = rule->StandardDate.wYear;
+ clientTimeZone->standardDate.wMonth = rule->StandardDate.wMonth;
+ clientTimeZone->standardDate.wDayOfWeek = rule->StandardDate.wDayOfWeek;
+ clientTimeZone->standardDate.wDay = rule->StandardDate.wDay;
+ clientTimeZone->standardDate.wHour = rule->StandardDate.wHour;
+ clientTimeZone->standardDate.wMinute = rule->StandardDate.wMinute;
+ clientTimeZone->standardDate.wSecond = rule->StandardDate.wSecond;
+ clientTimeZone->standardDate.wMilliseconds = rule->StandardDate.wMilliseconds;
+
+ clientTimeZone->daylightDate.wYear = rule->DaylightDate.wYear;
+ clientTimeZone->daylightDate.wMonth = rule->DaylightDate.wMonth;
+ clientTimeZone->daylightDate.wDayOfWeek = rule->DaylightDate.wDayOfWeek;
+ clientTimeZone->daylightDate.wDay = rule->DaylightDate.wDay;
+ clientTimeZone->daylightDate.wHour = rule->DaylightDate.wHour;
+ clientTimeZone->daylightDate.wMinute = rule->DaylightDate.wMinute;
+ clientTimeZone->daylightDate.wSecond = rule->DaylightDate.wSecond;
+ clientTimeZone->daylightDate.wMilliseconds = rule->DaylightDate.wMilliseconds;
+ }
+ }
+
+ xfree(tz);
+ }
+ else
+ {
+ /* could not detect timezone, fallback to using GMT */
+ DEBUG_TIMEZONE("tz not found, using GMT.");
+ sprintf(clientTimeZone->standardName, "%s", "GMT Standard Time");
+ sprintf(clientTimeZone->daylightName, "%s", "GMT Daylight Time");
+ }
+}
+
+/**
+ * Read client time zone information (TS_TIME_ZONE_INFORMATION).\n
+ * @msdn{cc240477}
+ * @param s stream
+ * @param settings settings
+ */
+
+boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings)
+{
+ char* str = NULL;
+ TIME_ZONE_INFO* clientTimeZone;
+
+ if (stream_get_left(s) < 172)
+ return false;
+
+ clientTimeZone = settings->client_time_zone;
+
+ stream_read_uint32(s, clientTimeZone->bias); /* Bias */
+
+ /* standardName (64 bytes) */
+ str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64 / 2);
+ stream_seek(s, 64);
+ strncpy(clientTimeZone->standardName, str, sizeof(clientTimeZone->standardName));
+ xfree(str);
+ str = NULL;
+
+ rdp_read_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
+ stream_read_uint32(s, clientTimeZone->standardBias); /* StandardBias */
+
+ /* daylightName (64 bytes) */
+ str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64 / 2);
+ stream_seek(s, 64);
+ strncpy(clientTimeZone->daylightName, str, sizeof(clientTimeZone->daylightName));
+ xfree(str);
+
+ rdp_read_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
+ stream_read_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */
+
+ return true;
+}
+
+/**
+ * Write client time zone information (TS_TIME_ZONE_INFORMATION).\n
+ * @msdn{cc240477}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings)
+{
+ size_t length;
+ uint8* standardName = NULL;
+ uint8* daylightName = NULL;
+ size_t standardNameLength;
+ size_t daylightNameLength;
+ TIME_ZONE_INFO* clientTimeZone;
+
+ // TODO: CHECK order!
+ //rdp_get_client_time_zone(s, settings);
+ //clientTimeZone = settings->client_time_zone;
+
+ clientTimeZone = settings->client_time_zone;
+ rdp_get_client_time_zone(s, settings);
+
+ standardName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->standardName, &length);
+ standardNameLength = length * 2;
+
+ daylightName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->daylightName, &length);
+ daylightNameLength = length * 2;
+
+ if (standardNameLength > 62)
+ standardNameLength = 62;
+
+ if (daylightNameLength > 62)
+ daylightNameLength = 62;
+
+ /* Bias */
+ stream_write_uint32(s, clientTimeZone->bias);
+
+ /* standardName (64 bytes) */
+ stream_write(s, standardName, standardNameLength);
+ stream_write_zero(s, 64 - standardNameLength);
+
+ /* StandardDate */
+ rdp_write_system_time(s, &clientTimeZone->standardDate);
+
+ DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'", clientTimeZone->bias, clientTimeZone->standardName, clientTimeZone->daylightName);
+
+ /* Note that StandardBias is ignored if no valid standardDate is provided. */
+
+ /* StandardBias */
+ stream_write_uint32(s, clientTimeZone->standardBias);
+ DEBUG_TIMEZONE("StandardBias=%d", clientTimeZone->standardBias);
+
+ /* daylightName (64 bytes) */
+ stream_write(s, daylightName, daylightNameLength);
+ stream_write_zero(s, 64 - daylightNameLength);
+
+ /* DaylightDate */
+ rdp_write_system_time(s, &clientTimeZone->daylightDate);
+
+ /* Note that DaylightBias is ignored if no valid daylightDate is provided. */
+
+ /* DaylightBias */
+ stream_write_uint32(s, clientTimeZone->daylightBias);
+ DEBUG_TIMEZONE("DaylightBias=%d", clientTimeZone->daylightBias);
+
+ xfree(standardName);
+ xfree(daylightName);
+}
diff --git a/libfreerdp-core/timezone.h b/libfreerdp-core/timezone.h
new file mode 100644
index 000000000..4ddeed0fa
--- /dev/null
+++ b/libfreerdp-core/timezone.h
@@ -0,0 +1,42 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Time Zone Redirection
+ *
+ * Copyright 2012 Marc-Andre Moreau
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __TIMEZONE_H
+#define __TIMEZONE_H
+
+#include "rdp.h"
+#include "config.h"
+
+#include
+#include
+#include
+
+void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time);
+void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time);
+void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings);
+boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings);
+void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings);
+
+#ifdef WITH_DEBUG_TIMEZONE
+#define DEBUG_TIMEZONE(fmt, ...) DEBUG_CLASS(TIMEZONE, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_TIMEZONE(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __TIMEZONE_H */
diff --git a/libfreerdp-core/transport.c b/libfreerdp-core/transport.c
index d66d0e690..df43a8ecb 100644
--- a/libfreerdp-core/transport.c
+++ b/libfreerdp-core/transport.c
@@ -121,10 +121,12 @@ boolean transport_connect_nla(rdpTransport* transport)
"If credentials are valid, the NTLMSSP implementation may be to blame.\n");
credssp_free(transport->credssp);
+ transport->credssp = NULL;
return false;
}
credssp_free(transport->credssp);
+ transport->credssp = NULL;
return true;
}
diff --git a/libfreerdp-utils/CMakeLists.txt b/libfreerdp-utils/CMakeLists.txt
index 6757afcd8..3ecb70ff6 100644
--- a/libfreerdp-utils/CMakeLists.txt
+++ b/libfreerdp-utils/CMakeLists.txt
@@ -46,6 +46,7 @@ set(FREERDP_UTILS_SRCS
string.c
svc_plugin.c
thread.c
+ time.c
unicode.c
wait_obj.c)
diff --git a/libfreerdp-utils/args.c b/libfreerdp-utils/args.c
index e37dc1fd9..d9b08c41f 100644
--- a/libfreerdp-utils/args.c
+++ b/libfreerdp-utils/args.c
@@ -133,6 +133,7 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
" --ignore-certificate: ignore verification of logon certificate\n"
" --sec: force protocol security (rdp, tls or nla)\n"
" --secure-checksum: use salted checksums with Standard RDP encryption\n"
+ " --wm-class: set window WM_CLASS hint\n"
" --version: print version information\n"
"\n", argv[0]);
return FREERDP_ARGS_PARSE_HELP; //TODO: What is the correct return
@@ -665,6 +666,16 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
{
settings->secure_checksum = true;
}
+ else if (strcmp("--wm-class", argv[index]) == 0)
+ {
+ index++;
+ if (index == argc)
+ {
+ printf("missing WM_CLASS value\n");
+ return -1;
+ }
+ settings->wm_class = xstrdup(argv[index]);
+ }
else if (strcmp("--version", argv[index]) == 0)
{
if (strlen(FREERDP_VERSION_SUFFIX))
diff --git a/libfreerdp-utils/time.c b/libfreerdp-utils/time.c
new file mode 100644
index 000000000..0a6052308
--- /dev/null
+++ b/libfreerdp-utils/time.c
@@ -0,0 +1,45 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Time Utils
+ *
+ * Copyright 2012 Marc-Andre Moreau
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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
+
+uint64 rdp_windows_gmtime()
+{
+ time_t unix_time;
+ uint64 windows_time;
+
+ time(&unix_time);
+ windows_time = rdp_get_windows_time_from_unix_time(unix_time);
+
+ return windows_time;
+}
+
+uint64 rdp_get_windows_time_from_unix_time(time_t unix_time)
+{
+ uint64 windows_time;
+ windows_time = ((uint64)unix_time * 10000000) + 621355968000000000ULL;
+ return windows_time;
+}
+
+time_t rdp_get_unix_time_from_windows_time(uint64 windows_time)
+{
+ time_t unix_time;
+ unix_time = (windows_time - 621355968000000000ULL) / 10000000;
+ return unix_time;
+}
diff --git a/scripts/TimeZones.cs b/scripts/TimeZones.cs
new file mode 100644
index 000000000..0d56032fa
--- /dev/null
+++ b/scripts/TimeZones.cs
@@ -0,0 +1,247 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Time Zone Redirection Table Generator
+ *
+ * Copyright 2012 Marc-Andre Moreau
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.IO;
+using System.Globalization;
+using System.Collections.ObjectModel;
+
+namespace TimeZones
+{
+ struct SYSTEM_TIME_ENTRY
+ {
+ public UInt16 wYear;
+ public UInt16 wMonth;
+ public UInt16 wDayOfWeek;
+ public UInt16 wDay;
+ public UInt16 wHour;
+ public UInt16 wMinute;
+ public UInt16 wSecond;
+ public UInt16 wMilliseconds;
+ };
+
+ struct TIME_ZONE_RULE_ENTRY
+ {
+ public long TicksStart;
+ public long TicksEnd;
+ public Int32 DaylightDelta;
+ public SYSTEM_TIME_ENTRY StandardDate;
+ public SYSTEM_TIME_ENTRY DaylightDate;
+ };
+
+ struct TIME_ZONE_ENTRY
+ {
+ public string Id;
+ public UInt32 Bias;
+ public bool SupportsDST;
+ public string DisplayName;
+ public string StandardName;
+ public string DaylightName;
+ public string RuleTable;
+ public UInt32 RuleTableCount;
+ };
+
+ class TimeZones
+ {
+ static void Main(string[] args)
+ {
+ int i;
+ UInt32 index;
+ const string file = @"TimeZones.txt";
+ TimeZoneInfo.AdjustmentRule[] rules;
+ StreamWriter stream = new StreamWriter(file, false);
+ ReadOnlyCollection timeZones = TimeZoneInfo.GetSystemTimeZones();
+
+ stream.WriteLine();
+
+ stream.WriteLine("struct _SYSTEM_TIME_ENTRY");
+ stream.WriteLine("{");
+ stream.WriteLine("\tuint16 wYear;");
+ stream.WriteLine("\tuint16 wMonth;");
+ stream.WriteLine("\tuint16 wDayOfWeek;");
+ stream.WriteLine("\tuint16 wDay;");
+ stream.WriteLine("\tuint16 wHour;");
+ stream.WriteLine("\tuint16 wMinute;");
+ stream.WriteLine("\tuint16 wSecond;");
+ stream.WriteLine("\tuint16 wMilliseconds;");
+ stream.WriteLine("};");
+ stream.WriteLine("typedef struct _SYSTEM_TIME_ENTRY SYSTEM_TIME_ENTRY;");
+ stream.WriteLine();
+
+ stream.WriteLine("struct _TIME_ZONE_RULE_ENTRY");
+ stream.WriteLine("{");
+ stream.WriteLine("\tuint64 TicksStart;");
+ stream.WriteLine("\tuint64 TicksEnd;");
+ stream.WriteLine("\tsint32 DaylightDelta;");
+ stream.WriteLine("\tSYSTEM_TIME_ENTRY StandardDate;");
+ stream.WriteLine("\tSYSTEM_TIME_ENTRY DaylightDate;");
+ stream.WriteLine("};");
+ stream.WriteLine("typedef struct _TIME_ZONE_RULE_ENTRY TIME_ZONE_RULE_ENTRY;");
+ stream.WriteLine();
+
+ stream.WriteLine("struct _TIME_ZONE_ENTRY");
+ stream.WriteLine("{");
+ stream.WriteLine("\tconst char* Id;");
+ stream.WriteLine("\tuint32 Bias;");
+ stream.WriteLine("\tboolean SupportsDST;");
+ stream.WriteLine("\tconst char* DisplayName;");
+ stream.WriteLine("\tconst char* StandardName;");
+ stream.WriteLine("\tconst char* DaylightName;");
+ stream.WriteLine("\tTIME_ZONE_RULE_ENTRY* RuleTable;");
+ stream.WriteLine("\tuint32 RuleTableCount;");
+ stream.WriteLine("};");
+ stream.WriteLine("typedef struct _TIME_ZONE_ENTRY TIME_ZONE_ENTRY;");
+ stream.WriteLine();
+
+ index = 0;
+
+ foreach (TimeZoneInfo timeZone in timeZones)
+ {
+ rules = timeZone.GetAdjustmentRules();
+
+ if ((!timeZone.SupportsDaylightSavingTime) || (rules.Length < 1))
+ {
+ index++;
+ continue;
+ }
+
+ stream.WriteLine("static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_{0}[] =", index);
+ stream.WriteLine("{");
+
+ i = 0;
+ foreach (TimeZoneInfo.AdjustmentRule rule in rules)
+ {
+ DateTime time;
+ TIME_ZONE_RULE_ENTRY tzr;
+ TimeZoneInfo.TransitionTime transition;
+
+ tzr.TicksStart = rule.DateEnd.ToUniversalTime().Ticks;
+ tzr.TicksEnd = rule.DateStart.ToUniversalTime().Ticks;
+ tzr.DaylightDelta = (Int32)rule.DaylightDelta.TotalMinutes;
+
+ transition = rule.DaylightTransitionEnd;
+ time = transition.TimeOfDay;
+
+ tzr.StandardDate.wYear = (UInt16)0;
+ tzr.StandardDate.wMonth = (UInt16)transition.Month;
+ tzr.StandardDate.wDayOfWeek = (UInt16)transition.DayOfWeek;
+ tzr.StandardDate.wDay = (UInt16)transition.Day;
+ tzr.StandardDate.wHour = (UInt16)time.Hour;
+ tzr.StandardDate.wMinute = (UInt16)time.Minute;
+ tzr.StandardDate.wSecond = (UInt16)time.Second;
+ tzr.StandardDate.wMilliseconds = (UInt16)time.Millisecond;
+
+ transition = rule.DaylightTransitionStart;
+ time = transition.TimeOfDay;
+
+ tzr.DaylightDate.wYear = (UInt16)0;
+ tzr.DaylightDate.wMonth = (UInt16)transition.Month;
+ tzr.DaylightDate.wDayOfWeek = (UInt16)transition.DayOfWeek;
+ tzr.DaylightDate.wDay = (UInt16)transition.Day;
+ tzr.DaylightDate.wHour = (UInt16)time.Hour;
+ tzr.DaylightDate.wMinute = (UInt16)time.Minute;
+ tzr.DaylightDate.wSecond = (UInt16)time.Second;
+ tzr.DaylightDate.wMilliseconds = (UInt16)time.Millisecond;
+
+ stream.Write("\t{");
+ stream.Write(" {0}, {1}, {2},", tzr.TicksStart, tzr.TicksEnd, tzr.DaylightDelta);
+
+ stream.Write(" { ");
+ stream.Write("{0}, {1}, {2}, {3}, {4}, {5}",
+ tzr.StandardDate.wYear, tzr.StandardDate.wMonth, tzr.StandardDate.wDayOfWeek,
+ tzr.StandardDate.wDay, tzr.StandardDate.wHour, tzr.StandardDate.wMinute,
+ tzr.StandardDate.wSecond, tzr.StandardDate.wMilliseconds);
+ stream.Write(" }, ");
+
+ stream.Write("{ ");
+ stream.Write("{0}, {1}, {2}, {3}, {4}, {5}",
+ tzr.DaylightDate.wYear, tzr.DaylightDate.wMonth, tzr.DaylightDate.wDayOfWeek,
+ tzr.DaylightDate.wDay, tzr.DaylightDate.wHour, tzr.DaylightDate.wMinute,
+ tzr.DaylightDate.wSecond, tzr.DaylightDate.wMilliseconds);
+ stream.Write(" },");
+
+ if (++i < rules.Length)
+ stream.WriteLine(" },");
+ else
+ stream.WriteLine(" }");
+ }
+
+ stream.WriteLine("};");
+ stream.WriteLine();
+ index++;
+ }
+
+ index = 0;
+ stream.WriteLine("static const TIME_ZONE_ENTRY TimeZoneTable[] =");
+ stream.WriteLine("{");
+
+ foreach (TimeZoneInfo timeZone in timeZones)
+ {
+ TIME_ZONE_ENTRY tz;
+ TimeSpan offset = timeZone.BaseUtcOffset;
+
+ rules = timeZone.GetAdjustmentRules();
+
+ tz.Id = timeZone.Id;
+
+ if (offset.Hours >= 0)
+ tz.Bias = (UInt32)((offset.Hours * 60) + offset.Minutes);
+ else
+ tz.Bias = (UInt32)(((-1 * offset.Hours) * 60) + offset.Minutes + 720);
+
+ tz.SupportsDST = timeZone.SupportsDaylightSavingTime;
+
+ tz.DisplayName = timeZone.DisplayName;
+ tz.StandardName = timeZone.StandardName;
+ tz.DaylightName = timeZone.DaylightName;
+
+ if ((!tz.SupportsDST) || (rules.Length < 1))
+ {
+ tz.RuleTableCount = 0;
+ tz.RuleTable = "NULL";
+ }
+ else
+ {
+ tz.RuleTableCount = (UInt32)rules.Length;
+ tz.RuleTable = "&TimeZoneRuleTable_" + index;
+ tz.RuleTable = "(TIME_ZONE_RULE_ENTRY*) &TimeZoneRuleTable_" + index;
+ }
+
+ stream.WriteLine("\t{");
+
+ stream.WriteLine("\t\t\"{0}\", {1}, {2}, \"{0}\",",
+ tz.Id, tz.Bias, tz.SupportsDST ? "true" : "false", tz.DisplayName);
+
+ stream.WriteLine("\t\t\"{0}\", \"{0}\",", tz.StandardName, tz.DaylightName);
+ stream.WriteLine("\t\t{0}, {1}", tz.RuleTable, tz.RuleTableCount);
+
+ index++;
+
+ if ((int) index < timeZones.Count)
+ stream.WriteLine("\t},");
+ else
+ stream.WriteLine("\t}");
+ }
+ stream.WriteLine("};");
+ stream.WriteLine();
+
+ stream.Close();
+ }
+ }
+}
diff --git a/scripts/WindowsZones.cs b/scripts/WindowsZones.cs
new file mode 100644
index 000000000..d9c2464bd
--- /dev/null
+++ b/scripts/WindowsZones.cs
@@ -0,0 +1,90 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * TZID to Windows TimeZone Identifier Table Generator
+ *
+ * Copyright 2012 Marc-Andre Moreau
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.IO;
+using System.Xml;
+using System.Text;
+using System.Collections;
+using System.Collections.Generic;
+
+/*
+ * this script uses windowsZones.xml which can be obtained at:
+ * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
+ */
+
+namespace WindowsZones
+{
+ class MainClass
+ {
+ public static void Main(string[] args)
+ {
+ string tzid, windows;
+ const string file = @"WindowsZones.txt";
+ List list = new List();
+ StreamWriter stream = new StreamWriter(file, false);
+ XmlTextReader reader = new XmlTextReader(@"windowsZones.xml");
+
+ stream.WriteLine("struct _WINDOWS_TZID_ENTRY");
+ stream.WriteLine("{");
+ stream.WriteLine("\tconst char* windows;");
+ stream.WriteLine("\tconst char* tzid;");
+ stream.WriteLine("};");
+ stream.WriteLine("typedef struct _WINDOWS_TZID_ENTRY WINDOWS_TZID_ENTRY;");
+ stream.WriteLine();
+
+ while (reader.Read())
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+
+ if (reader.Name.Equals("mapZone"))
+ {
+ tzid = reader.GetAttribute("type");
+ windows = reader.GetAttribute("other");
+
+ string entry = String.Format("\"{0}\", \"{1}\"", windows, tzid);
+
+ if (!list.Contains(entry))
+ list.Add(entry);
+ }
+
+ break;
+ }
+ }
+
+ list.Sort();
+
+ stream.WriteLine("const WINDOWS_TZID_ENTRY WindowsTimeZoneIdTable[] =");
+ stream.WriteLine("{");
+
+ foreach (string entry in list)
+ {
+ stream.Write("\t{ ");
+ stream.Write(entry);
+ stream.WriteLine(" },");
+ }
+
+ stream.WriteLine("};");
+
+ stream.Close();
+ }
+ }
+}