summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/tools/qtimezone.cpp899
-rw-r--r--src/corelib/tools/qtimezone.h162
-rw-r--r--src/corelib/tools/qtimezoneprivate.cpp643
-rw-r--r--src/corelib/tools/qtimezoneprivate_data_p.h1122
-rw-r--r--src/corelib/tools/qtimezoneprivate_p.h198
-rw-r--r--src/corelib/tools/tools.pri5
6 files changed, 3029 insertions, 0 deletions
diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp
new file mode 100644
index 0000000000..a739d9c69f
--- /dev/null
+++ b/src/corelib/tools/qtimezone.cpp
@@ -0,0 +1,899 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 John Layt <jlayt@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qtimezone.h"
+#include "qtimezoneprivate_p.h"
+
+#include <QtCore/qdatetime.h>
+
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+// Create default time zone using appropriate backend
+static QTimeZonePrivate *newBackendTimeZone()
+{
+ return new QUtcTimeZonePrivate();
+}
+
+// Create named time zone using appropriate backend
+static QTimeZonePrivate *newBackendTimeZone(const QByteArray &olsenId)
+{
+ return new QUtcTimeZonePrivate(olsenId);
+}
+
+class QTimeZoneSingleton
+{
+public:
+ QTimeZoneSingleton() : backend(newBackendTimeZone()) {}
+
+ // The backend_tz is the tz to use in static methods such as availableTimeZoneIds() and
+ // isTimeZoneIdAvailable() and to create named Olsen time zones. This is usually the host
+ // system, but may be different if the host resources are insufficient or if
+ // QT_NO_SYSTEMLOCALE is set. A simple UTC backend is used if no alternative is available.
+ QSharedDataPointer<QTimeZonePrivate> backend;
+};
+
+Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
+
+/*!
+ \class QTimeZone
+ \inmodule QtCore
+ \since 5.2
+ \brief The QTimeZone class converts between between UTC and local time in a
+ specific time zone.
+
+ \threadsafe
+
+ This class provides a stateless calculator for time zone conversions
+ between UTC and the local time in a specific time zone. By default it uses
+ the host system time zone data to perform these conversions.
+
+ This class is primarily designed for use in QDateTime; most applications
+ will not need to access this class directly and should instead use
+ QDateTime with a Qt::TimeSpec of Qt::TimeZone.
+
+ \note For consistency with QDateTime, QTimeZone does not account for leap
+ seconds.
+
+ \section1
+
+ \section2 Olsen Time Zone IDs
+
+ QTimeZone uses the Olsen time zone IDs as defined in the IANA Time Zone
+ Database (http://www.iana.org/time-zones). This is to ensure a standard ID
+ across all supported platforms. Most platforms support the Olsen IDs
+ and the IANA Database natively, but for Windows a mapping is required to
+ the native IDs. See below for more details.
+
+ The Olsen IDs can and do change on a regular basis, and can vary depending
+ on how recently the host system data was updated. As such you cannot rely
+ on any given ID existing on any host system. You must use
+ availableTimeZoneIds() to determine what Olsen IDs are available.
+
+ \section2 UTC Offset Time Zones
+
+ A default UTC time zone backend is provided which is always guaranteed to
+ be available. This provides a set of generic Offset From UTC time zones
+ in the range UTC-14:00 to UTC+14:00. These time zones can be created
+ using either the standard ISO format names "UTC+00:00" as listed by
+ availableTimeZoneIds(), or using the number of offset seconds.
+
+ \section2 Windows Time Zones
+
+ Windows native time zone support is severely limited compared to the
+ standard IANA TZ Database. Windows time zones cover larger geographic
+ areas and are thus less accurate in their conversions. They also do not
+ support as much historic conversion data and so may only be accurate for
+ the current year.
+
+ QTimeZone uses a conversion table derived form the Unicode CLDR data to map
+ between Olsen IDs and Windows IDs. Depending on your version of Windows
+ and Qt, this table may not be able to provide a valid conversion, in which
+ "UTC" will be returned.
+
+ QTimeZone provides a public API to use this conversion table. The Windows ID
+ used is the Windows Registry Key for the time zone which is also the MS
+ Exchange EWS ID as well, but is different to the Time Zone Name (TZID) and
+ COD code used by MS Exchange in versions before 2007.
+
+ \section2 System Time Zone
+
+ QTimeZone does not support any concept of a system or default time zone.
+ If you require a QDateTime that uses the current system time zone at any
+ given moment then you should use a Qt::TimeSpec of Qt::LocalTime.
+
+ The method systemTimeZoneId() returns the current system Olsen time zone
+ ID which on OSX and Linux will always be correct. On Windows this ID is
+ translated from the the Windows system ID using an internal translation
+ table and the user's selected country. As a consequence there is a small
+ chance any Windows install may have IDs not known by Qt, in which case
+ "UTC" will be returned.
+
+ Creating a new QTimeZone instance using the system time zone ID will only
+ produce a fixed named copy of the time zone, it will not change if the
+ system time zone changes.
+
+ \section2 Time Zone Offsets
+
+ The difference between UTC and the local time in a time zone is expressed
+ as an offset in seconds from UTC, i.e. the number of seconds to add to UTC
+ to obtain the local time. The total offset is comprised of two component
+ parts, the standard time offset and the daylight time offset. The standard
+ time offset is the number of seconds to add to UTC to obtain standard time
+ in the time zone. The daylight time offset is the number of seconds to add
+ to the standard time offset to obtain daylight time in the time zone.
+
+ Note that the standard and daylight offsets for a time zone may change over
+ time as countries have changed daylight time laws or even their standard
+ time offset.
+
+ \section2 License
+
+ This class includes data obtained from the CLDR data files under the terms
+ of the Unicode license.
+
+ \legalese
+ COPYRIGHT AND PERMISSION NOTICE
+
+ Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under
+ the Terms of Use in http://www.unicode.org/copyright.html.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of the Unicode data files and any associated documentation (the "Data
+ Files") or Unicode software and any associated documentation (the "Software")
+ to deal in the Data Files or Software without restriction, including without
+ limitation the rights to use, copy, modify, merge, publish, distribute, and/or
+ sell copies of the Data Files or Software, and to permit persons to whom the
+ Data Files or Software are furnished to do so, provided that (a) the above
+ copyright notice(s) and this permission notice appear with all copies of the
+ Data Files or Software, (b) both the above copyright notice(s) and this
+ permission notice appear in associated documentation, and (c) there is clear
+ notice in each modified Data File or in the Software as well as in the
+ documentation associated with the Data File(s) or Software that the data or
+ software has been modified.
+ \endlegalese
+
+ \sa QDateTime
+*/
+
+/*!
+ \enum QTimeZone::TimeType
+
+ The type of time zone time, for example when requesting the name. In time
+ zones that do not apply daylight time, all three values may return the
+ same result.
+
+ \value StandardTime
+ The standard time in a time zone, i.e. when Daylight Savings is not
+ in effect.
+ For example when formatting a display name this will show something
+ like "Pacific Standard Time".
+ \value DaylightTime
+ A time when Daylight Savings is in effect.
+ For example when formatting a display name this will show something
+ like "Pacific daylight time".
+ \value GenericTime
+ A time which is not specifically Standard or Daylight time, either
+ an unknown time or a neutral form.
+ For example when formatting a display name this will show something
+ like "Pacific Time".
+*/
+
+/*!
+ \enum QTimeZone::NameType
+
+ The type of time zone name.
+
+ \value DefaultName
+ The default form of the time zone name, e.g. LongName, ShortName or OffsetName
+ \value LongName
+ The long form of the time zone name, e.g. "Central European Time"
+ \value ShortName
+ The short form of the time zone name, usually an abbreviation, e.g. "CET"
+ \value OffsetName
+ The standard ISO offset form of the time zone name, e.g. "UTC+01:00"
+*/
+
+/*!
+ \class QTimeZone::OffsetData
+ \inmodule QtCore
+
+ The time zone offset data for a given moment in time, i.e. the time zone
+ offsets and abbreviation to use at that moment in time.
+
+ \list
+ \li OffsetData::atUtc The datetime of the offset data in UTC time.
+ \li OffsetData::offsetFromUtc The total offset from UTC in effect at the datetime.
+ \li OffsetData::standardTimeOffset The standard time offset component of the total offset.
+ \li OffsetData::daylightTimeOffset The daylight time offset component of the total offset.
+ \li OffsetData::abbreviation The abbreviation in effect at the datetime.
+ \endlist
+
+ For example, for time zone "Europe/Berlin" the OffsetDate in standard and daylight time might be:
+
+ \list
+ \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC)
+ \li offsetFromUtc = 3600
+ \li standardTimeOffset = 3600
+ \li daylightTimeOffset = 0
+ \li abbreviation = "CET"
+ \endlist
+
+ \list
+ \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::UTC)
+ \li offsetFromUtc = 7200
+ \li standardTimeOffset = 3600
+ \li daylightTimeOffset = 3600
+ \li abbreviation = "CEST"
+ \endlist
+*/
+
+/*!
+ \typedef QTimeZone::OffsetDataList
+ \relates QTimeZone
+
+ Synonym for QList<OffsetData>.
+*/
+
+/*!
+ Create a null/invalid time zone instance.
+*/
+
+QTimeZone::QTimeZone()
+ : d(0)
+{
+}
+
+/*!
+ Creates an instance of the requested time zone \a olsenId.
+
+ The ID must be one of the available system IDs otherwise an invalid
+ time zone will be returned.
+
+ \sa availableTimeZoneIds()
+*/
+
+QTimeZone::QTimeZone(const QByteArray &olsenId)
+{
+ // Try and see if it's a valid UTC offset ID, just as quick to try create as look-up
+ d = new QUtcTimeZonePrivate(olsenId);
+ // If not a valid UTC offset ID then try create it with the system backend
+ // Relies on backend not creating valid tz with invalid name
+ if (!d->isValid())
+ d = newBackendTimeZone(olsenId);
+}
+
+/*!
+ Creates an instance of a time zone with the requested Offset from UTC of
+ \a offsetSeconds.
+
+ The \a offsetSeconds from UTC must be in the range -14 hours to +14 hours
+ otherwise an invalid time zone will be returned.
+*/
+
+QTimeZone::QTimeZone(int offsetSeconds)
+{
+ // offsetSeconds must fall between -14:00 and +14:00 hours
+ if (offsetSeconds >= -50400 && offsetSeconds <= 50400)
+ d = new QUtcTimeZonePrivate(offsetSeconds);
+ else
+ d = 0;
+}
+
+/*!
+ Creates a custom time zone with an ID of \a olsenId and an offset from UTC
+ of \a offsetSeconds. The \a name will be the name used by displayName()
+ for the LongName, the \a abbreviation will be used by displayName() for the
+ ShortName and by abbreviation(), and the optional \a country will be used
+ by country(). The \a comment is an optional note that may be displayed in
+ a GUI to assist users in selecting a time zone.
+
+ The \a olsenId must not be one of the available system IDs returned by
+ availableTimeZoneIds(). The \a offsetSeconds from UTC must be in the range
+ -14 hours to +14 hours.
+
+ If the custom time zone does not have a specific country then set it to the
+ default value of QLocale::AnyCountry.
+*/
+
+QTimeZone::QTimeZone(const QByteArray &olsenId, int offsetSeconds, const QString &name,
+ const QString &abbreviation, QLocale::Country country, const QString &comment)
+{
+ // olsenId must be a valid ID and must not clash with the standard system names
+ if (QTimeZonePrivate::isValidId(olsenId) && !availableTimeZoneIds().contains(olsenId))
+ d = new QUtcTimeZonePrivate(olsenId, offsetSeconds, name, abbreviation, country, comment);
+ else
+ d = 0;
+}
+
+/*!
+ \internal
+
+ Private. Create time zone with given private backend
+*/
+
+QTimeZone::QTimeZone(QTimeZonePrivate &dd)
+ : d(&dd)
+{
+}
+
+/*!
+ Copy constructor, copy \a other to this.
+*/
+
+QTimeZone::QTimeZone(const QTimeZone &other)
+ : d(other.d)
+{
+}
+
+/*!
+ Destroys the time zone.
+*/
+
+QTimeZone::~QTimeZone()
+{
+}
+
+/*!
+ Assignment operator, assign \a other to this.
+*/
+
+QTimeZone &QTimeZone::operator=(const QTimeZone &other)
+{
+ d = other.d;
+ return *this;
+}
+
+/*!
+ Returns true if this time zone is equal to the \a other time zone.
+*/
+
+bool QTimeZone::operator==(const QTimeZone &other) const
+{
+ if (d && other.d)
+ return (*d == *other.d);
+ else
+ return (d == other.d);
+}
+
+/*!
+ Returns true if this time zone is not equal to the \a other time zone.
+*/
+
+bool QTimeZone::operator!=(const QTimeZone &other) const
+{
+ if (d && other.d)
+ return (*d != *other.d);
+ else
+ return (d != other.d);
+}
+
+/*!
+ Returns true if this time zone is valid.
+*/
+
+bool QTimeZone::isValid() const
+{
+ if (d)
+ return d->isValid();
+ else
+ return false;
+}
+
+/*!
+ Returns the Olsen ID for the time zone.
+
+ Olsen IDs are used on all platforms. On Windows these are translated
+ from the Windows ID into the closest Olsen ID for the time zone and country.
+*/
+
+QByteArray QTimeZone::id() const
+{
+ if (d)
+ return d->id();
+ else
+ return QByteArray();
+}
+
+/*!
+ Returns the country for the time zone.
+*/
+
+QLocale::Country QTimeZone::country() const
+{
+ if (isValid())
+ return d->country();
+ else
+ return QLocale::AnyCountry;
+}
+
+/*!
+ Returns any comment for the time zone.
+
+ A comment may be provided by the host platform to assist users in
+ choosing the correct time zone. Depending on the platform this may not
+ be localized.
+*/
+
+QString QTimeZone::comment() const
+{
+ if (isValid())
+ return d->comment();
+ else
+ return QString();
+}
+
+/*!
+ Returns the localized time zone display name at the given \a atDateTime
+ for the given \a nameType in the given \a locale. The \a nameType and
+ \a locale requested may not be supported on all platforms, in which case
+ the best available option will be returned.
+
+ If the \a locale is not provided then the application default locale will
+ be used.
+
+ The display name may change depending on daylight time or historical
+ events.
+
+ \sa abbreviation()
+*/
+
+QString QTimeZone::displayName(const QDateTime &atDateTime, NameType nameType,
+ const QLocale &locale) const
+{
+ if (isValid())
+ return d->displayName(atDateTime.toMSecsSinceEpoch(), nameType, locale);
+ else
+ return QString();
+}
+
+/*!
+ Returns the localized time zone display name for the given \a timeType
+ and \a nameType in the given \a locale. The \a nameType and \a locale
+ requested may not be supported on all platforms, in which case the best
+ available option will be returned.
+
+ If the \a locale is not provided then the application default locale will
+ be used.
+
+ Where the time zone display names have changed over time then the most
+ recent names will be used.
+
+ \sa abbreviation()
+*/
+
+QString QTimeZone::displayName(TimeType timeType, NameType nameType,
+ const QLocale &locale) const
+{
+ if (isValid())
+ return d->displayName(timeType, nameType, locale);
+ else
+ return QString();
+}
+
+/*!
+ Returns the time zone abbreviation at the given \a atDateTime. The
+ abbreviation may change depending on daylight time or even
+ historical events.
+
+ Note that the abbreviation is not guaranteed to be unique to this time zone
+ and should not be used in place of the ID or display name.
+
+ \sa displayName()
+*/
+
+QString QTimeZone::abbreviation(const QDateTime &atDateTime) const
+{
+ if (isValid())
+ return d->abbreviation(atDateTime.toMSecsSinceEpoch());
+ else
+ return QString();
+}
+
+/*!
+ Returns the total effective offset at the given \a atDateTime, i.e. the
+ number of seconds to add to UTC to obtain the local time. This includes
+ any daylight time offset that may be in effect, i.e. it is the sum of
+ standardTimeOffset() and daylightTimeOffset() for the given datetime.
+
+ For example, for the time zone "Europe/Berlin" the standard time offset is
+ +3600 seconds and the daylight time offset is +3600 seconds. During standard
+ time offsetFromUtc() will return +3600 (UTC+01:00), and during daylight time
+ it will return +7200 (UTC+02:00).
+
+ \sa standardTimeOffset(), daylightTimeOffset()
+*/
+
+int QTimeZone::offsetFromUtc(const QDateTime &atDateTime) const
+{
+ if (isValid())
+ return d->offsetFromUtc(atDateTime.toMSecsSinceEpoch());
+ else
+ return 0;
+}
+
+/*!
+ Returns the standard time offset at the given \a atDateTime, i.e. the
+ number of seconds to add to UTC to obtain the local Standard Time. This
+ excludes any daylight time offset that may be in effect.
+
+ For example, for the time zone "Europe/Berlin" the standard time offset is
+ +3600 seconds. During both standard and daylight time offsetFromUtc() will
+ return +3600 (UTC+01:00).
+
+ \sa offsetFromUtc(), daylightTimeOffset()
+*/
+
+int QTimeZone::standardTimeOffset(const QDateTime &atDateTime) const
+{
+ if (isValid())
+ return d->standardTimeOffset(atDateTime.toMSecsSinceEpoch());
+ else
+ return 0;
+}
+
+/*!
+ Returns the daylight time offset at the given \a atDateTime, i.e. the
+ number of seconds to add to the standard time offset to obtain the local
+ daylight time.
+
+ For example, for the time zone "Europe/Berlin" the daylight time offset
+ is +3600 seconds. During standard time daylightTimeOffset() will return
+ 0, and during daylight time it will return +3600.
+
+ \sa offsetFromUtc(), standardTimeOffset()
+*/
+
+int QTimeZone::daylightTimeOffset(const QDateTime &atDateTime) const
+{
+ if (hasDaylightTime())
+ return d->daylightTimeOffset(atDateTime.toMSecsSinceEpoch());
+ else
+ return 0;
+}
+
+/*!
+ Returns true if the time zone has observed daylight time at any time.
+
+ \sa isDaylightTime(), daylightTimeOffset()
+*/
+
+bool QTimeZone::hasDaylightTime() const
+{
+ if (isValid())
+ return d->hasDaylightTime();
+ else
+ return false;
+}
+
+/*!
+ Returns true if the given \a atDateTime is in daylight time.
+
+ \sa hasDaylightTime(), daylightTimeOffset()
+*/
+
+bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const
+{
+ if (hasDaylightTime())
+ return d->isDaylightTime(atDateTime.toMSecsSinceEpoch());
+ else
+ return false;
+}
+
+/*!
+ Returns the effective offset details at the given \a forDateTime. This is
+ the equivalent of calling offsetFromUtc(), abbreviation(), etc individually but is
+ more efficient.
+
+ \sa offsetFromUtc(), standardTimeOffset(), daylightTimeOffset(), abbreviation()
+*/
+
+QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
+{
+ if (hasTransitions())
+ return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
+ else
+ return d->invalidOffsetData();
+}
+
+/*!
+ Returns true if the system backend supports obtaining transitions.
+*/
+
+bool QTimeZone::hasTransitions() const
+{
+ if (isValid())
+ return d->hasTransitions();
+ else
+ return false;
+}
+
+/*!
+ Returns the first time zone Transition after the given \a afterDateTime.
+ This is most useful when you have a Transition time and wish to find the
+ Transition after it.
+
+ The given \a afterDateTime is exclusive.
+
+ \sa hasTransitions(), previousTransition(), transitions()
+*/
+
+QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const
+{
+ if (hasTransitions())
+ return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
+ else
+ return d->invalidOffsetData();
+}
+
+/*!
+ Returns the first time zone Transition before the given \a beforeDateTime.
+ This is most useful when you have a Transition time and wish to find the
+ Transition before it.
+
+ The given \a beforeDateTime is exclusive.
+
+ \sa hasTransitions(), nextTransition(), transitions()
+*/
+
+QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const
+{
+ if (hasTransitions())
+ return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
+ else
+ return d->invalidOffsetData();
+}
+
+/*!
+ Returns a list of all time zone transitions between the given datetimes.
+
+ The given \a fromDateTime and \a toDateTime are inclusive.
+
+ \sa hasTransitions(), nextTransition(), previousTransition()
+*/
+
+QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
+ const QDateTime &toDateTime) const
+{
+ OffsetDataList list;
+ if (hasTransitions()) {
+ QTimeZonePrivate::DataList plist = d->transitions(fromDateTime.toMSecsSinceEpoch(),
+ toDateTime.toMSecsSinceEpoch());
+ foreach (const QTimeZonePrivate::Data &pdata, plist)
+ list.append(d->toOffsetData(pdata));
+ }
+ return list;
+}
+
+// Static methods
+
+/*!
+ Returns the current system time zone Olsen ID.
+
+ On Windows this ID is translated from the the Windows ID using an internal
+ translation table and the user's selected country. As a consequence there
+ is a small chance any Windows install may have IDs not known by Qt, in
+ which case "UTC" will be returned.
+*/
+
+QByteArray QTimeZone::systemTimeZoneId()
+{
+ return global_tz->backend->systemTimeZoneId();
+}
+
+/*!
+ Returns true if a given time zone \a olsenId is available on this system.
+
+ \sa availableTimeZoneIds()
+*/
+
+bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &olsenId)
+{
+ // isValidId is not strictly required, but faster to weed out invalid
+ // IDs as availableTimeZoneIds() may be slow
+ return (QTimeZonePrivate::isValidId(olsenId) && (availableTimeZoneIds().contains(olsenId)));
+}
+
+/*!
+ Returns a list of all available Olsen time zone IDs on this system.
+
+ \sa isTimeZoneIdAvailable()
+*/
+
+QList<QByteArray> QTimeZone::availableTimeZoneIds()
+{
+ QSet<QByteArray> set = QUtcTimeZonePrivate().availableTimeZoneIds()
+ + global_tz->backend->availableTimeZoneIds();
+ QList<QByteArray> list = set.toList();
+ qSort(list);
+ return list;
+}
+
+/*!
+ Returns a list of all available Olsen time zone IDs for a given \a country.
+
+ As a special case, a \a country of Qt::AnyCountry returns those time zones
+ that do not have any country related to them, such as UTC. If you require
+ a list of all time zone IDs for all countries then use the standard
+ availableTimeZoneIds() method.
+
+ \sa isTimeZoneIdAvailable()
+*/
+
+QList<QByteArray> QTimeZone::availableTimeZoneIds(QLocale::Country country)
+{
+ QSet<QByteArray> set = QUtcTimeZonePrivate().availableTimeZoneIds(country)
+ + global_tz->backend->availableTimeZoneIds(country);
+ QList<QByteArray> list = set.toList();
+ qSort(list);
+ return list;
+}
+
+/*!
+ Returns a list of all available Olsen time zone IDs with a given standard
+ time offset of \a offsetSeconds.
+
+ \sa isTimeZoneIdAvailable()
+*/
+
+QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds)
+{
+ QSet<QByteArray> set = QUtcTimeZonePrivate().availableTimeZoneIds(offsetSeconds)
+ + global_tz->backend->availableTimeZoneIds(offsetSeconds);
+ QList<QByteArray> list = set.toList();
+ qSort(list);
+ return list;
+}
+
+/*!
+ Returns the Windows ID equivalent to the given \a olsenId.
+
+ \sa windowsIdToDefaultOlsenId(), windowsIdToOlsenIds()
+*/
+
+QByteArray QTimeZone::olsenIdToWindowsId(const QByteArray &olsenId)
+{
+ return QTimeZonePrivate::olsenIdToWindowsId(olsenId);
+}
+
+/*!
+ Returns the default Olsen ID for a given \a windowsId.
+
+ Because a Windows ID can cover several Olsen IDs in several different
+ countries, this function returns the most frequently used Olsen ID with no
+ regard for the country and should thus be used with care. It is usually
+ best to request the default for a specific country.
+
+ \sa olsenIdToWindowsId(), windowsIdToOlsenIds()
+*/
+
+QByteArray QTimeZone::windowsIdToDefaultOlsenId(const QByteArray &windowsId)
+{
+ return QTimeZonePrivate::windowsIdToDefaultOlsenId(windowsId);
+}
+
+/*!
+ Returns the default Olsen ID for a given \a windowsId and \a country.
+
+ Because a Windows ID can cover several Olsen IDs within a given country,
+ the most frequently used Olsen ID in that country is returned.
+
+ As a special case, QLocale::AnyCountry returns the default of those Olsen IDs
+ that do not have any specific country.
+
+ \sa olsenIdToWindowsId(), windowsIdToOlsenIds()
+*/
+
+QByteArray QTimeZone::windowsIdToDefaultOlsenId(const QByteArray &windowsId,
+ QLocale::Country country)
+{
+ return QTimeZonePrivate::windowsIdToDefaultOlsenId(windowsId, country);
+}
+
+/*!
+ Returns all the Olsen IDs for a given \a windowsId.
+
+ The returned list is sorted alphabetically.
+
+ \sa olsenIdToWindowsId(), windowsIdToDefaultOlsenId()
+*/
+
+QList<QByteArray> QTimeZone::windowsIdToOlsenIds(const QByteArray &windowsId)
+{
+ return QTimeZonePrivate::windowsIdToOlsenIds(windowsId);
+}
+
+/*!
+ Returns all the Olsen IDs for a given \a windowsId and \a country.
+
+ As a special case QLocale::AnyCountry returns those Olsen IDs that do
+ not have any specific country.
+
+ The returned list is in order of frequency of usage, i.e. larger zones
+ within a country are listed first.
+
+ \sa olsenIdToWindowsId(), windowsIdToDefaultOlsenId()
+*/
+
+QList<QByteArray> QTimeZone::windowsIdToOlsenIds(const QByteArray &windowsId,
+ QLocale::Country country)
+{
+ return QTimeZonePrivate::windowsIdToOlsenIds(windowsId, country);
+}
+
+#ifndef QT_NO_DATASTREAM
+QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz)
+{
+ tz.d->serialize(ds);
+ return ds;
+}
+
+QDataStream &operator>>(QDataStream &ds, QTimeZone &tz)
+{
+ QString olsenId;
+ ds >> olsenId;
+ if (olsenId == QStringLiteral("OffsetFromUtc")) {
+ int utcOffset;
+ QString name;
+ QString abbreviation;
+ int country;
+ QString comment;
+ ds >> olsenId >> utcOffset >> name >> abbreviation >> country >> comment;
+ tz = QTimeZone(olsenId.toUtf8(), utcOffset, name, abbreviation, (QLocale::Country) country, comment);
+ } else {
+ tz = QTimeZone(olsenId.toUtf8());
+ }
+ return ds;
+}
+#endif // QT_NO_DATASTREAM
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug dbg, const QTimeZone &tz)
+{
+ //TODO Include backend and data version details?
+ dbg.nospace() << QStringLiteral("QTimeZone(") << qPrintable(QString::fromUtf8(tz.id())) << ')';
+ return dbg.space();
+}
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezone.h b/src/corelib/tools/qtimezone.h
new file mode 100644
index 0000000000..5eeb22f8f3
--- /dev/null
+++ b/src/corelib/tools/qtimezone.h
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 John Layt <jlayt@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QTIMEZONE_H
+#define QTIMEZONE_H
+
+#include <QtCore/qsharedpointer.h>
+#include <QtCore/qlocale.h>
+#include <QtCore/qdatetime.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTimeZonePrivate;
+
+class Q_CORE_EXPORT QTimeZone
+{
+public:
+ enum TimeType {
+ StandardTime = 0,
+ DaylightTime = 1,
+ GenericTime = 2
+ };
+
+ enum NameType {
+ DefaultName = 0,
+ LongName = 1,
+ ShortName = 2,
+ OffsetName = 3
+ };
+
+ struct OffsetData {
+ QString abbreviation;
+ QDateTime atUtc;
+ int offsetFromUtc;
+ int standardTimeOffset;
+ int daylightTimeOffset;
+ };
+ typedef QVector<OffsetData> OffsetDataList;
+
+ QTimeZone();
+ explicit QTimeZone(const QByteArray &olsenId);
+ QTimeZone(int offsetSeconds);
+ QTimeZone(const QByteArray &zoneId, int offsetSeconds, const QString &name,
+ const QString &abbreviation, QLocale::Country country = QLocale::AnyCountry,
+ const QString &comment = QString());
+ QTimeZone(const QTimeZone &other);
+ ~QTimeZone();
+
+ QTimeZone &operator=(const QTimeZone &other);
+ #ifdef Q_COMPILER_RVALUE_REFS
+ QTimeZone &operator=(QTimeZone &&other) { std::swap(d, other.d); return *this; }
+#endif
+
+ bool operator==(const QTimeZone &other) const;
+ bool operator!=(const QTimeZone &other) const;
+
+ bool isValid() const;
+
+ QByteArray id() const;
+ QLocale::Country country() const;
+ QString comment() const;
+
+ QString displayName(const QDateTime &atDateTime,
+ QTimeZone::NameType nameType = QTimeZone::DefaultName,
+ const QLocale &locale = QLocale()) const;
+ QString displayName(QTimeZone::TimeType timeType,
+ QTimeZone::NameType nameType = QTimeZone::DefaultName,
+ const QLocale &locale = QLocale()) const;
+ QString abbreviation(const QDateTime &atDateTime) const;
+
+ int offsetFromUtc(const QDateTime &atDateTime) const;
+ int standardTimeOffset(const QDateTime &atDateTime) const;
+ int daylightTimeOffset(const QDateTime &atDateTime) const;
+
+ bool hasDaylightTime() const;
+ bool isDaylightTime(const QDateTime &atDateTime) const;
+
+ OffsetData offsetData(const QDateTime &forDateTime) const;
+
+ bool hasTransitions() const;
+ OffsetData nextTransition(const QDateTime &afterDateTime) const;
+ OffsetData previousTransition(const QDateTime &beforeDateTime) const;
+ OffsetDataList transitions(const QDateTime &fromDateTime, const QDateTime &toDateTime) const;
+
+ static QByteArray systemTimeZoneId();
+
+ static bool isTimeZoneIdAvailable(const QByteArray &olsenId);
+
+ static QList<QByteArray> availableTimeZoneIds();
+ static QList<QByteArray> availableTimeZoneIds(QLocale::Country country);
+ static QList<QByteArray> availableTimeZoneIds(int offsetSeconds);
+
+ static QByteArray olsenIdToWindowsId(const QByteArray &olsenId);
+ static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId);
+ static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId,
+ QLocale::Country country);
+ static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId);
+ static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId,
+ QLocale::Country country);
+
+private:
+ QTimeZone(QTimeZonePrivate &dd);
+#ifndef QT_NO_DATASTREAM
+ friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz);
+#endif
+ friend class QTimeZonePrivate;
+ QSharedDataPointer<QTimeZonePrivate> d;
+};
+
+Q_DECLARE_TYPEINFO(QTimeZone::OffsetData, Q_MOVABLE_TYPE);
+
+#ifndef QT_NO_DATASTREAM
+Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz);
+Q_CORE_EXPORT QDataStream &operator>>(QDataStream &ds, QTimeZone &tz);
+#endif
+
+#ifndef QT_NO_DEBUG_STREAM
+Q_CORE_EXPORT QDebug operator<<(QDebug dbg, const QTimeZone &tz);
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QTIMEZONE_H
diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp
new file mode 100644
index 0000000000..4a8d891759
--- /dev/null
+++ b/src/corelib/tools/qtimezoneprivate.cpp
@@ -0,0 +1,643 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 John Layt <jlayt@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qtimezone.h"
+#include "qtimezoneprivate_p.h"
+#include "qtimezoneprivate_data_p.h"
+
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+/*
+ Static utilities for looking up Windows ID tables
+*/
+
+static const int windowsDataTableSize = sizeof(windowsDataTable) / sizeof(QWindowsData) - 1;
+static const int zoneDataTableSize = sizeof(zoneDataTable) / sizeof(QZoneData) - 1;
+static const int utcDataTableSize = sizeof(utcDataTable) / sizeof(QUtcData) - 1;
+
+
+static const QZoneData *zoneData(quint16 index)
+{
+ Q_ASSERT(index < zoneDataTableSize);
+ return &zoneDataTable[index];
+}
+
+static const QWindowsData *windowsData(quint16 index)
+{
+ Q_ASSERT(index < windowsDataTableSize);
+ return &windowsDataTable[index];
+}
+
+static const QUtcData *utcData(quint16 index)
+{
+ Q_ASSERT(index < utcDataTableSize);
+ return &utcDataTable[index];
+}
+
+// Return the Windows ID literal for a given QWindowsData
+static QByteArray windowsId(const QWindowsData *windowsData)
+{
+ return (windowsIdData + windowsData->windowsIdIndex);
+}
+
+// Return the Olsen ID literal for a given QWindowsData
+static QByteArray olsenId(const QWindowsData *windowsData)
+{
+ return (olsenIdData + windowsData->olsenIdIndex);
+}
+
+// Return the Olsen ID literal for a given QZoneData
+static QByteArray olsenId(const QZoneData *zoneData)
+{
+ return (olsenIdData + zoneData->olsenIdIndex);
+}
+
+static QByteArray utcId(const QUtcData *utcData)
+{
+ return (olsenIdData + utcData->olsenIdIndex);
+}
+
+static quint16 toWindowsIdKey(const QByteArray &winId)
+{
+ for (quint16 i = 0; i < windowsDataTableSize; ++i) {
+ const QWindowsData *data = windowsData(i);
+ if (windowsId(data) == winId)
+ return data->windowsIdKey;
+ }
+ return 0;
+}
+
+static QByteArray toWindowsIdLiteral(quint16 windowsIdKey)
+{
+ for (quint16 i = 0; i < windowsDataTableSize; ++i) {
+ const QWindowsData *data = windowsData(i);
+ if (data->windowsIdKey == windowsIdKey)
+ return windowsId(data);
+ }
+ return QByteArray();
+}
+
+/*
+ Base class implementing common utility routines, only intantiate for a null tz.
+*/
+
+QTimeZonePrivate::QTimeZonePrivate()
+{
+}
+
+QTimeZonePrivate::QTimeZonePrivate(const QTimeZonePrivate &other)
+ : QSharedData(other), m_id(other.m_id)
+{
+}
+
+QTimeZonePrivate::~QTimeZonePrivate()
+{
+}
+
+QTimeZonePrivate *QTimeZonePrivate::clone()
+{
+ return new QTimeZonePrivate(*this);
+}
+
+bool QTimeZonePrivate::operator==(const QTimeZonePrivate &other) const
+{
+ // TODO Too simple, but need to solve problem of comparing different derived classes
+ // Should work for all System and ICU classes as names guaranteed unique, but not for Simple.
+ // Perhaps once all classes have working transitions can compare full list?
+ return (m_id == other.m_id);
+}
+
+bool QTimeZonePrivate::operator!=(const QTimeZonePrivate &other) const
+{
+ return !(*this == other);
+}
+
+bool QTimeZonePrivate::isValid() const
+{
+ return !m_id.isEmpty();
+}
+
+QByteArray QTimeZonePrivate::id() const
+{
+ return m_id;
+}
+
+QLocale::Country QTimeZonePrivate::country() const
+{
+ // Default fall-back mode, use the zoneTable to find Region of known Zones
+ for (int i = 0; i < zoneDataTableSize; ++i) {
+ const QZoneData *data = zoneData(i);
+ if (olsenId(data).split(' ').contains(m_id))
+ return (QLocale::Country)data->country;
+ }
+ return QLocale::AnyCountry;
+}
+
+QString QTimeZonePrivate::comment() const
+{
+ return QString();
+}
+
+QString QTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch,
+ QTimeZone::NameType nameType,
+ const QLocale &locale) const
+{
+ if (nameType == QTimeZone::OffsetName)
+ return isoOffsetFormat(offsetFromUtc(atMSecsSinceEpoch));
+
+ if (isDaylightTime(atMSecsSinceEpoch))
+ return displayName(QTimeZone::DaylightTime, nameType, locale);
+ else
+ return displayName(QTimeZone::StandardTime, nameType, locale);
+}
+
+QString QTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
+ QTimeZone::NameType nameType,
+ const QLocale &locale) const
+{
+ Q_UNUSED(timeType)
+ Q_UNUSED(nameType)
+ Q_UNUSED(locale)
+ return QString();
+}
+
+QString QTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return QString();
+}
+
+int QTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
+{
+ return standardTimeOffset(atMSecsSinceEpoch) + daylightTimeOffset(atMSecsSinceEpoch);
+}
+
+int QTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return invalidSeconds();
+}
+
+int QTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return invalidSeconds();
+}
+
+bool QTimeZonePrivate::hasDaylightTime() const
+{
+ return false;
+}
+
+bool QTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return false;
+}
+
+QTimeZonePrivate::Data QTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
+{
+ Q_UNUSED(forMSecsSinceEpoch)
+ return invalidData();
+}
+
+bool QTimeZonePrivate::hasTransitions() const
+{
+ return false;
+}
+
+QTimeZonePrivate::Data QTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
+{
+ Q_UNUSED(afterMSecsSinceEpoch)
+ return invalidData();
+}
+
+QTimeZonePrivate::Data QTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
+{
+ Q_UNUSED(beforeMSecsSinceEpoch)
+ return invalidData();
+}
+
+QTimeZonePrivate::DataList QTimeZonePrivate::transitions(qint64 fromMSecsSinceEpoch,
+ qint64 toMSecsSinceEpoch) const
+{
+ DataList list;
+ if (toMSecsSinceEpoch > fromMSecsSinceEpoch) {
+ // fromMSecsSinceEpoch is inclusive but nextTransitionTime() is exclusive so go back 1 msec
+ Data next = nextTransition(fromMSecsSinceEpoch - 1);
+ while (next.atMSecsSinceEpoch <= toMSecsSinceEpoch) {
+ list.append(next);
+ next = nextTransition(next.atMSecsSinceEpoch);
+ }
+ }
+ return list;
+}
+
+QByteArray QTimeZonePrivate::systemTimeZoneId() const
+{
+ return QByteArray();
+}
+
+QSet<QByteArray> QTimeZonePrivate::availableTimeZoneIds() const
+{
+ return QSet<QByteArray>();
+}
+
+QSet<QByteArray> QTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
+{
+ // Default fall-back mode, use the zoneTable to find Region of know Zones
+ QSet<QByteArray> regionSet;
+
+ // First get all Zones in the Zones table belonging to the Region
+ for (int i = 0; i < zoneDataTableSize; ++i) {
+ if (zoneData(i)->country == country)
+ regionSet += olsenId(zoneData(i)).split(' ').toSet();
+ }
+
+ // Then select just those that are available
+ QSet<QByteArray> set;
+ foreach (const QByteArray &olsenId, availableTimeZoneIds()) {
+ if (regionSet.contains(olsenId))
+ set << olsenId;
+ }
+
+ return set;
+}
+
+QSet<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const
+{
+ // Default fall-back mode, use the zoneTable to find Offset of know Zones
+ QSet<QByteArray> offsetSet;
+ // First get all Zones in the table using the Offset
+ for (int i = 0; i < windowsDataTableSize; ++i) {
+ const QWindowsData *winData = windowsData(i);
+ if (winData->offsetFromUtc == offsetFromUtc) {
+ for (int j = 0; j < zoneDataTableSize; ++j) {
+ const QZoneData *data = zoneData(j);
+ if (data->windowsIdKey == winData->windowsIdKey)
+ offsetSet += olsenId(data).split(' ').toSet();
+ }
+ }
+ }
+
+ // Then select just those that are available
+ QSet<QByteArray> set;
+ foreach (const QByteArray &olsenId, availableTimeZoneIds()) {
+ if (offsetSet.contains(olsenId))
+ set << olsenId;
+ }
+
+ return set;
+}
+
+#ifndef QT_NO_DATASTREAM
+void QTimeZonePrivate::serialize(QDataStream &ds) const
+{
+ ds << QString::fromUtf8(m_id);
+}
+#endif // QT_NO_DATASTREAM
+
+// Static Utility Methods
+
+QTimeZonePrivate::Data QTimeZonePrivate::invalidData()
+{
+ Data data;
+ data.atMSecsSinceEpoch = invalidMSecs();
+ data.offsetFromUtc = invalidSeconds();
+ data.standardTimeOffset = invalidSeconds();
+ data.daylightTimeOffset = invalidSeconds();
+ return data;
+}
+
+QTimeZone::OffsetData QTimeZonePrivate::invalidOffsetData()
+{
+ QTimeZone::OffsetData offsetData;
+ offsetData.atUtc = QDateTime();
+ offsetData.offsetFromUtc = invalidSeconds();
+ offsetData.standardTimeOffset = invalidSeconds();
+ offsetData.daylightTimeOffset = invalidSeconds();
+ return offsetData;
+}
+
+QTimeZone::OffsetData QTimeZonePrivate::toOffsetData(const QTimeZonePrivate::Data &data)
+{
+ QTimeZone::OffsetData offsetData = invalidOffsetData();
+ if (data.atMSecsSinceEpoch != invalidMSecs()) {
+ offsetData.atUtc = QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, Qt::UTC);
+ offsetData.offsetFromUtc = data.offsetFromUtc;
+ offsetData.standardTimeOffset = data.standardTimeOffset;
+ offsetData.daylightTimeOffset = data.daylightTimeOffset;
+ offsetData.abbreviation = data.abbreviation;
+ }
+ return offsetData;
+}
+
+// If the format of the ID is valid
+bool QTimeZonePrivate::isValidId(const QByteArray &olsenId)
+{
+ // Rules for defining TZ/Olsen names as per ftp://ftp.iana.org/tz/code/Theory
+ // * Use only valid POSIX file name components
+ // * Within a file name component, use only ASCII letters, `.', `-' and `_'.
+ // * Do not use digits
+ // * A file name component must not exceed 14 characters or start with `-'
+ // Aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid so we need to accept digits
+ if (olsenId.contains(' '))
+ return false;
+ QList<QByteArray> parts = olsenId.split('\\');
+ foreach (const QByteArray &part, parts) {
+ if (part.size() > 14)
+ return false;
+ if (part.at(0) == '-')
+ return false;
+ for (int i = 0; i < part.size(); ++i) {
+ QChar ch = part.at(i);
+ if (!(ch >= 'a' && ch <= 'z')
+ && !(ch >= 'A' && ch <= 'Z')
+ && !(ch == '_')
+ && !(ch >= '0' && ch <= '9')
+ && !(ch == '-')
+ && !(ch == '.'))
+ return false;
+ }
+ }
+ return true;
+}
+
+QString QTimeZonePrivate::isoOffsetFormat(int offsetFromUtc)
+{
+ const int mins = offsetFromUtc / 60;
+ return QString::fromUtf8("UTC%1%2:%3").arg(mins >= 0 ? QLatin1Char('+') : QLatin1Char('-'))
+ .arg(qAbs(mins) / 60, 2, 10, QLatin1Char('0'))
+ .arg(qAbs(mins) % 60, 2, 10, QLatin1Char('0'));
+}
+
+QByteArray QTimeZonePrivate::olsenIdToWindowsId(const QByteArray &id)
+{
+ for (int i = 0; i < zoneDataTableSize; ++i) {
+ const QZoneData *data = zoneData(i);
+ if (olsenId(data).split(' ').contains(id))
+ return toWindowsIdLiteral(data->windowsIdKey);
+ }
+ return QByteArray();
+}
+
+QByteArray QTimeZonePrivate::windowsIdToDefaultOlsenId(const QByteArray &windowsId)
+{
+ const quint16 windowsIdKey = toWindowsIdKey(windowsId);
+ for (int i = 0; i < windowsDataTableSize; ++i) {
+ const QWindowsData *data = windowsData(i);
+ if (data->windowsIdKey == windowsIdKey)
+ return olsenId(data);
+ }
+ return QByteArray();
+}
+
+QByteArray QTimeZonePrivate::windowsIdToDefaultOlsenId(const QByteArray &windowsId,
+ QLocale::Country country)
+{
+ const QList<QByteArray> list = windowsIdToOlsenIds(windowsId, country);
+ if (list.count() > 0)
+ return list.first();
+ else
+ return QByteArray();
+}
+
+QList<QByteArray> QTimeZonePrivate::windowsIdToOlsenIds(const QByteArray &windowsId)
+{
+ const quint16 windowsIdKey = toWindowsIdKey(windowsId);
+ QList<QByteArray> list;
+
+ for (int i = 0; i < zoneDataTableSize; ++i) {
+ const QZoneData *data = zoneData(i);
+ if (data->windowsIdKey == windowsIdKey)
+ list << olsenId(data).split(' ');
+ }
+
+ // Return the full list in alpha order
+ std::sort(list.begin(), list.end());
+ return list;
+}
+
+QList<QByteArray> QTimeZonePrivate::windowsIdToOlsenIds(const QByteArray &windowsId,
+ QLocale::Country country)
+{
+ const quint16 windowsIdKey = toWindowsIdKey(windowsId);
+ for (int i = 0; i < zoneDataTableSize; ++i) {
+ const QZoneData *data = zoneData(i);
+ // Return the region matches in preference order
+ if (data->windowsIdKey == windowsIdKey && data->country == (quint16) country)
+ return olsenId(data).split(' ');
+ }
+
+ return QList<QByteArray>();
+}
+
+// Define template for derived classes to reimplement so QSharedDataPointer clone() works correctly
+template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone()
+{
+ return d->clone();
+}
+
+/*
+ UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and QT_USE_ICU not set,
+ or for QDateTimes with a Qt:Spec of Qt::OffsetFromUtc.
+*/
+
+// Create default UTC time zone
+QUtcTimeZonePrivate::QUtcTimeZonePrivate()
+{
+ const QString name = QStringLiteral("UTC");
+ init(QByteArrayLiteral("UTC"), 0, name, name, QLocale::AnyCountry, name);
+}
+
+// Create a named UTC time zone
+QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id)
+{
+ // Look for the name in the UTC list, if found set the values
+ for (int i = 0; i < utcDataTableSize; ++i) {
+ const QUtcData *data = utcData(i);
+ const QByteArray uid = utcId(data);
+ if (uid == id) {
+ QString name = QString::fromUtf8(id);
+ init(id, data->offsetFromUtc, name, name, QLocale::AnyCountry, name);
+ break;
+ }
+ }
+}
+
+// Create offset from UTC
+QUtcTimeZonePrivate::QUtcTimeZonePrivate(qint32 offsetSeconds)
+{
+ QString utcId;
+
+ if (offsetSeconds == 0)
+ utcId = QStringLiteral("UTC");
+ else
+ utcId = isoOffsetFormat(offsetSeconds);
+
+ init(utcId.toUtf8(), offsetSeconds, utcId, utcId, QLocale::AnyCountry, utcId);
+}
+
+QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds,
+ const QString &name, const QString &abbreviation,
+ QLocale::Country country, const QString &comment)
+{
+ init(zoneId, offsetSeconds, name, abbreviation, country, comment);
+}
+
+QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other)
+ : QTimeZonePrivate(other), m_offsetFromUtc(other.m_offsetFromUtc), m_name(other.m_name),
+ m_abbreviation(other.m_abbreviation), m_country(other.m_country),
+ m_comment(other.m_comment)
+{
+}
+
+QUtcTimeZonePrivate::~QUtcTimeZonePrivate()
+{
+}
+
+QTimeZonePrivate *QUtcTimeZonePrivate::clone()
+{
+ return new QUtcTimeZonePrivate(*this);
+}
+
+void QUtcTimeZonePrivate::init(const QByteArray &zoneId)
+{
+ m_id = zoneId;
+}
+
+void QUtcTimeZonePrivate::init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
+ const QString &abbreviation, QLocale::Country country,
+ const QString &comment)
+{
+ m_id = zoneId;
+ m_offsetFromUtc = offsetSeconds;
+ m_name = name;
+ m_abbreviation = abbreviation;
+ m_country = country;
+ m_comment = comment;
+}
+
+QLocale::Country QUtcTimeZonePrivate::country() const
+{
+ return m_country;
+}
+
+QString QUtcTimeZonePrivate::comment() const
+{
+ return m_comment;
+}
+
+QString QUtcTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
+ QTimeZone::NameType nameType,
+ const QLocale &locale) const
+{
+ Q_UNUSED(timeType)
+ Q_UNUSED(locale)
+ if (nameType == QTimeZone::ShortName)
+ return m_abbreviation;
+ else if (nameType == QTimeZone::OffsetName)
+ return isoOffsetFormat(m_offsetFromUtc);
+ return m_name;
+}
+
+QString QUtcTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return m_abbreviation;
+}
+
+qint32 QUtcTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return m_offsetFromUtc;
+}
+
+qint32 QUtcTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
+{
+ Q_UNUSED(atMSecsSinceEpoch)
+ return 0;
+}
+
+QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const
+{
+ return QByteArrayLiteral("UTC");
+}
+
+QSet<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const
+{
+ QSet<QByteArray> set;
+ for (int i = 0; i < utcDataTableSize; ++i)
+ set << utcId(utcData(i));
+ return set;
+}
+
+QSet<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
+{
+ // If AnyCountry then is request for all non-region offset codes
+ if (country == QLocale::AnyCountry)
+ return availableTimeZoneIds();
+ return QSet<QByteArray>();
+}
+
+QSet<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds) const
+{
+ QSet<QByteArray> set;
+ for (int i = 0; i < utcDataTableSize; ++i) {
+ const QUtcData *data = utcData(i);
+ if (data->offsetFromUtc == offsetSeconds)
+ set << utcId(data);
+ }
+ return set;
+}
+
+#ifndef QT_NO_DATASTREAM
+void QUtcTimeZonePrivate::serialize(QDataStream &ds) const
+{
+ ds << QStringLiteral("OffsetFromUtc") << QString::fromUtf8(m_id) << m_offsetFromUtc << m_name
+ << m_abbreviation << (qint32) m_country << m_comment;
+}
+#endif // QT_NO_DATASTREAM
+
+QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezoneprivate_data_p.h b/src/corelib/tools/qtimezoneprivate_data_p.h
new file mode 100644
index 0000000000..bb87eab1f3
--- /dev/null
+++ b/src/corelib/tools/qtimezoneprivate_data_p.h
@@ -0,0 +1,1122 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 John Layt <jlayt@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QTIMEZONEPRIVATE_DATA_P_H
+#define QTIMEZONEPRIVATE_DATA_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+/*
+ Windows Zone ID support, included in default base class build so can be used on all platforms,
+ e.g. an app running on Linux may need to communicate with a Windows Outlook server. These
+ tables can also be used to look-up Region Codes and UTC Offsets on platforms that don't directly
+ support them., e.g. Mac does not support availableTimeZones() filtering by region or offset.
+
+ Another data table is provided for generic UTC+00:00 format time zones to be used as a
+ fall-back if no system time zones are available (QT_NO_SYSTEMLOCALE is set) or for QDateTimes
+ with a QT:Spec of OffsetFromUTC
+
+ These tables are automatically adapted from the CLDR supplemental/windowsZones.xml data file
+ using a script in qtbase/util/local_database. Please do not edit this data directly. In the
+ future if ICU is made a hard dependency then the ICU resource can be used directly and this
+ table removed
+*/
+
+struct QZoneData {
+ quint16 windowsIdKey; // Windows ID Key
+ quint16 country; // Country of Olsen ID's, AnyCountry means No Country
+ quint16 olsenIdIndex; // All Olsen ID's for the Windows ID and Country, space separated
+};
+
+struct QWindowsData {
+ quint16 windowsIdKey; // Windows ID Key
+ quint16 windowsIdIndex; // Windows ID Literal
+ quint16 olsenIdIndex; // Default Olsen ID for the Windows ID
+ qint32 offsetFromUtc; // Standard Time Offset from UTC, used for quick look-ups
+};
+
+struct QUtcData {
+ quint16 olsenIdIndex; // Olsen ID's
+ qint32 offsetFromUtc; // Offset form UTC is seconds
+};
+
+/*
+ COPYRIGHT AND PERMISSION NOTICE
+
+ Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under
+ the Terms of Use in http://www.unicode.org/copyright.html.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of the Unicode data files and any associated documentation (the "Data
+ Files") or Unicode software and any associated documentation (the "Software")
+ to deal in the Data Files or Software without restriction, including without
+ limitation the rights to use, copy, modify, merge, publish, distribute, and/or
+ sell copies of the Data Files or Software, and to permit persons to whom the
+ Data Files or Software are furnished to do so, provided that (a) the above
+ copyright notice(s) and this permission notice appear with all copies of the
+ Data Files or Software, (b) both the above copyright notice(s) and this
+ permission notice appear in associated documentation, and (c) there is clear
+ notice in each modified Data File or in the Software as well as in the
+ documentation associated with the Data File(s) or Software that the data or
+ software has been modified.
+*/
+
+// GENERATED PART STARTS HERE
+
+/*
+ This part of the file was generated on 2013-03-18 from the
+ Common Locale Data Repository supplemental/windowsZones.xml file
+ $Revision: 7825 $ $Date: 2012-10-10 14:45:31 -0700 (Wed, 10 Oct 2012) $
+
+ http://www.unicode.org/cldr/
+
+ Do not change this data, only generate it using cldr2qtimezone.py.
+*/
+
+// Windows ID Key, Country Enum, Olsen ID Index
+static const QZoneData zoneDataTable[] = {
+ { 95, 157, 0 }, // W. Central Africa Standard Time / Nigeria
+ { 36, 73, 13 }, // FLE Standard Time / Finland
+ { 26, 97, 29 }, // China Standard Time / HongKong
+ { 83, 112, 44 }, // Tonga Standard Time / Kiribati
+ { 7, 24, 62 }, // Atlantic Standard Time / Bermuda
+ { 82, 101, 79 }, // Tokyo Standard Time / Indonesia
+ { 36, 68, 93 }, // FLE Standard Time / Estonia
+ { 73, 93, 108 }, // SA Western Standard Time / Guyana
+ { 73, 144, 123 }, // SA Western Standard Time / Montserrat
+ { 80, 208, 142 }, // Taipei Standard Time / Taiwan
+ { 96, 184, 154 }, // W. Europe Standard Time / SanMarino
+ { 17, 13, 172 }, // Cen. Australia Standard Time / Australia
+ { 72, 166, 213 }, // SA Pacific Standard Time / Panama
+ { 72, 47, 228 }, // SA Pacific Standard Time / Colombia
+ { 40, 132, 243 }, // Greenwich Standard Time / Mali
+ { 61, 38, 257 }, // Newfoundland Standard Time / Canada
+ { 18, 96, 274 }, // Central America Standard Time / Honduras
+ { 28, 48, 294 }, // E. Africa Standard Time / Comoros
+ { 85, 143, 308 }, // Ulaanbaatar Standard Time / Mongolia
+ { 73, 180, 341 }, // SA Western Standard Time / SaintKittsAndNevis
+ { 40, 236, 358 }, // Greenwich Standard Time / WesternSahara
+ { 97, 110, 374 }, // West Asia Standard Time / Kazakhstan
+ { 42, 77, 407 }, // Hawaiian Standard Time / FrenchPolynesia
+ { 6, 10, 422 }, // Argentina Standard Time / Argentina
+ { 20, 30, 695 }, // Central Brazilian Standard Time / Brazil
+ { 47, 20, 731 }, // Kaliningrad Standard Time / Belarus
+ { 32, 38, 744 }, // Eastern Standard Time / Canada
+ { 48, 114, 849 }, // Korea Standard Time / SouthKorea
+ { 87, 0, 860 }, // US Mountain Standard Time / AnyCountry
+ { 94, 13, 870 }, // W. Australia Standard Time / Australia
+ { 60, 8, 886 }, // New Zealand Standard Time / Antarctica
+ { 90, 0, 927 }, // UTC / AnyCountry
+ { 96, 133, 935 }, // W. Europe Standard Time / Malta
+ { 73, 88, 948 }, // SA Western Standard Time / Guadeloupe
+ { 56, 46, 967 }, // Myanmar Standard Time / CocosIslands
+ { 91, 220, 980 }, // UTC+12 / Tuvalu
+ { 1, 1, 997 }, // Afghanistan Standard Time / Afghanistan
+ { 41, 177, 1008 }, // GTB Standard Time / Romania
+ { 73, 26, 1025 }, // SA Western Standard Time / Bolivia
+ { 88, 30, 1040 }, // UTC-02 / Brazil
+ { 96, 123, 1056 }, // W. Europe Standard Time / Liechtenstein
+ { 25, 139, 1069 }, // Central Standard Time / Mexico
+ { 40, 199, 1087 }, // Greenwich Standard Time / SaintHelena
+ { 52, 227, 1106 }, // Montevideo Standard Time / Uruguay
+ { 55, 139, 1125 }, // Mountain Standard Time / Mexico
+ { 98, 8, 1141 }, // West Pacific Standard Time / Antarctica
+ { 36, 248, 1167 }, // FLE Standard Time / AlandIslands
+ { 25, 38, 1184 }, // Central Standard Time / Canada
+ { 32, 219, 1259 }, // Eastern Standard Time / TurksAndCaicosIslands
+ { 72, 63, 1278 }, // SA Pacific Standard Time / Ecuador
+ { 26, 44, 1296 }, // China Standard Time / China
+ { 31, 30, 1362 }, // E. South America Standard Time / Brazil
+ { 95, 216, 1380 }, // W. Central Africa Standard Time / Tunisia
+ { 97, 228, 1393 }, // West Asia Standard Time / Uzbekistan
+ { 42, 0, 1422 }, // Hawaiian Standard Time / AnyCountry
+ { 28, 8, 1433 }, // E. Africa Standard Time / Antarctica
+ { 36, 33, 1450 }, // FLE Standard Time / Bulgaria
+ { 18, 65, 1463 }, // Central America Standard Time / ElSalvador
+ { 76, 130, 1483 }, // Singapore Standard Time / Malaysia
+ { 73, 0, 1514 }, // SA Western Standard Time / AnyCountry
+ { 70, 178, 1524 }, // Russian Standard Time / Russia
+ { 89, 158, 1569 }, // UTC-11 / Niue
+ { 77, 120, 1582 }, // South Africa Standard Time / Lesotho
+ { 87, 139, 1596 }, // US Mountain Standard Time / Mexico
+ { 28, 111, 1615 }, // E. Africa Standard Time / Kenya
+ { 98, 160, 1630 }, // West Pacific Standard Time / NorthernMarianaIslands
+ { 28, 194, 1645 }, // E. Africa Standard Time / Somalia
+ { 26, 126, 1662 }, // China Standard Time / Macau
+ { 96, 151, 1673 }, // W. Europe Standard Time / Netherlands
+ { 87, 225, 1690 }, // US Mountain Standard Time / UnitedStates
+ { 38, 251, 1706 }, // GMT Standard Time / IsleOfMan
+ { 91, 226, 1725 }, // UTC+12 / UnitedStatesMinorOutlyingIslands
+ { 23, 153, 1738 }, // Central Pacific Standard Time / NewCaledonia
+ { 73, 135, 1753 }, // SA Western Standard Time / Martinique
+ { 19, 8, 1772 }, // Central Asia Standard Time / Antarctica
+ { 18, 0, 1790 }, // Central America Standard Time / AnyCountry
+ { 23, 229, 1800 }, // Central Pacific Standard Time / Vanuatu
+ { 39, 86, 1814 }, // Greenland Standard Time / Greenland
+ { 38, 71, 1830 }, // GMT Standard Time / FaroeIslands
+ { 82, 108, 1846 }, // Tokyo Standard Time / Japan
+ { 21, 192, 1857 }, // Central Europe Standard Time / Slovenia
+ { 77, 35, 1874 }, // South Africa Standard Time / Burundi
+ { 75, 232, 1891 }, // SE Asia Standard Time / Vietnam
+ { 41, 85, 1903 }, // GTB Standard Time / Greece
+ { 7, 38, 1917 }, // Atlantic Standard Time / Canada
+ { 5, 103, 1985 }, // Arabic Standard Time / Iraq
+ { 96, 205, 1998 }, // W. Europe Standard Time / Sweden
+ { 73, 233, 2015 }, // SA Western Standard Time / BritishVirginIslands
+ { 3, 186, 2031 }, // Arab Standard Time / SaudiArabia
+ { 44, 102, 2043 }, // Iran Standard Time / Iran
+ { 75, 0, 2055 }, // SE Asia Standard Time / AnyCountry
+ { 82, 0, 2065 }, // Tokyo Standard Time / AnyCountry
+ { 40, 136, 2075 }, // Greenwich Standard Time / Mauritania
+ { 69, 21, 2093 }, // Romance Standard Time / Belgium
+ { 42, 225, 2109 }, // Hawaiian Standard Time / UnitedStates
+ { 95, 3, 2126 }, // W. Central Africa Standard Time / Algeria
+ { 72, 38, 2141 }, // SA Pacific Standard Time / Canada
+ { 87, 38, 2163 }, // US Mountain Standard Time / Canada
+ { 95, 49, 2200 }, // W. Central Africa Standard Time / CongoKinshasa
+ { 18, 52, 2216 }, // Central America Standard Time / CostaRica
+ { 23, 140, 2235 }, // Central Pacific Standard Time / Micronesia
+ { 28, 254, 2265 }, // E. Africa Standard Time / SouthSudan
+ { 95, 156, 2277 }, // W. Central Africa Standard Time / Niger
+ { 40, 80, 2291 }, // Greenwich Standard Time / Gambia
+ { 75, 36, 2305 }, // SE Asia Standard Time / Cambodia
+ { 69, 197, 2321 }, // Romance Standard Time / Spain
+ { 97, 218, 2348 }, // West Asia Standard Time / Turkmenistan
+ { 37, 81, 2362 }, // Georgian Standard Time / Georgia
+ { 75, 101, 2375 }, // SE Asia Standard Time / Indonesia
+ { 18, 155, 2403 }, // Central America Standard Time / Nicaragua
+ { 73, 9, 2419 }, // SA Western Standard Time / AntiguaAndBarbuda
+ { 76, 101, 2435 }, // Singapore Standard Time / Indonesia
+ { 98, 167, 2449 }, // West Pacific Standard Time / PapuaNewGuinea
+ { 25, 0, 2470 }, // Central Standard Time / AnyCountry
+ { 32, 16, 2478 }, // Eastern Standard Time / Bahamas
+ { 73, 30, 2493 }, // SA Western Standard Time / Brazil
+ { 38, 173, 2582 }, // GMT Standard Time / Portugal
+ { 74, 183, 2613 }, // Samoa Standard Time / Samoa
+ { 60, 154, 2626 }, // New Zealand Standard Time / NewZealand
+ { 33, 64, 2643 }, // Egypt Standard Time / Egypt
+ { 73, 19, 2656 }, // SA Western Standard Time / Barbados
+ { 71, 8, 2673 }, // SA Eastern Standard Time / Antarctica
+ { 97, 209, 2692 }, // West Asia Standard Time / Tajikistan
+ { 77, 0, 2706 }, // South Africa Standard Time / AnyCountry
+ { 42, 226, 2716 }, // Hawaiian Standard Time / UnitedStatesMinorOutlyingIslands
+ { 28, 210, 2733 }, // E. Africa Standard Time / Tanzania
+ { 95, 37, 2754 }, // W. Central Africa Standard Time / Cameroon
+ { 58, 148, 2768 }, // Namibia Standard Time / Namibia
+ { 34, 178, 2784 }, // Ekaterinburg Standard Time / Russia
+ { 28, 221, 2803 }, // E. Africa Standard Time / Uganda
+ { 28, 138, 2818 }, // E. Africa Standard Time / Mayotte
+ { 40, 92, 2833 }, // Greenwich Standard Time / GuineaBissau
+ { 97, 78, 2847 }, // West Asia Standard Time / FrenchSouthernTerritories
+ { 77, 240, 2864 }, // South Africa Standard Time / Zimbabwe
+ { 95, 79, 2878 }, // W. Central Africa Standard Time / Gabon
+ { 76, 190, 2896 }, // Singapore Standard Time / Singapore
+ { 15, 0, 2911 }, // Cape Verde Standard Time / AnyCountry
+ { 89, 226, 2921 }, // UTC-11 / UnitedStatesMinorOutlyingIslands
+ { 24, 139, 2936 }, // Central Standard Time (Mexico) / Mexico
+ { 78, 198, 3027 }, // Sri Lanka Standard Time / SriLanka
+ { 36, 222, 3040 }, // FLE Standard Time / Ukraine
+ { 32, 225, 3104 }, // Eastern Standard Time / UnitedStates
+ { 9, 13, 3261 }, // AUS Eastern Standard Time / Australia
+ { 32, 0, 3298 }, // Eastern Standard Time / AnyCountry
+ { 73, 244, 3306 }, // SA Western Standard Time / Saint Barthelemy
+ { 3, 115, 3328 }, // Arab Standard Time / Kuwait
+ { 95, 41, 3340 }, // W. Central Africa Standard Time / CentralAfricanRepublic
+ { 95, 0, 3354 }, // W. Central Africa Standard Time / AnyCountry
+ { 72, 107, 3364 }, // SA Pacific Standard Time / Jamaica
+ { 68, 168, 3380 }, // Paraguay Standard Time / Paraguay
+ { 73, 182, 3397 }, // SA Western Standard Time / SaintVincentAndTheGrenadines
+ { 96, 82, 3416 }, // W. Europe Standard Time / Germany
+ { 66, 225, 3430 }, // Pacific Standard Time / UnitedStates
+ { 73, 61, 3450 }, // SA Western Standard Time / DominicanRepublic
+ { 89, 0, 3472 }, // UTC-11 / AnyCountry
+ { 19, 110, 3483 }, // Central Asia Standard Time / Kazakhstan
+ { 29, 13, 3510 }, // E. Australia Standard Time / Australia
+ { 91, 235, 3548 }, // UTC+12 / WallisAndFutunaIslands
+ { 13, 25, 3563 }, // Bangladesh Standard Time / Bhutan
+ { 54, 139, 3576 }, // Mountain Standard Time (Mexico) / Mexico
+ { 73, 152, 3611 }, // SA Western Standard Time / CuraSao
+ { 97, 8, 3627 }, // West Asia Standard Time / Antarctica
+ { 59, 150, 3645 }, // Nepal Standard Time / Nepal
+ { 73, 7, 3659 }, // SA Western Standard Time / Anguilla
+ { 40, 121, 3676 }, // Greenwich Standard Time / Liberia
+ { 18, 22, 3692 }, // Central America Standard Time / Belize
+ { 21, 243, 3707 }, // Central Europe Standard Time / Serbia
+ { 4, 162, 3723 }, // Arabian Standard Time / Oman
+ { 41, 141, 3735 }, // GTB Standard Time / Moldova
+ { 71, 76, 3751 }, // SA Eastern Standard Time / FrenchGuiana
+ { 77, 122, 3767 }, // South Africa Standard Time / Libya
+ { 50, 176, 3782 }, // Mauritius Standard Time / Reunion
+ { 23, 8, 3797 }, // Central Pacific Standard Time / Antarctica
+ { 28, 67, 3818 }, // E. Africa Standard Time / Eritrea
+ { 40, 212, 3832 }, // Greenwich Standard Time / Togo
+ { 10, 15, 3844 }, // Azerbaijan Standard Time / Azerbaijan
+ { 8, 13, 3854 }, // AUS Central Standard Time / Australia
+ { 28, 128, 3871 }, // E. Africa Standard Time / Madagascar
+ { 55, 0, 3891 }, // Mountain Standard Time / AnyCountry
+ { 36, 118, 3899 }, // FLE Standard Time / Latvia
+ { 28, 59, 3911 }, // E. Africa Standard Time / Djibouti
+ { 23, 193, 3927 }, // Central Pacific Standard Time / SolomonIslands
+ { 18, 63, 3947 }, // Central America Standard Time / Ecuador
+ { 76, 170, 3965 }, // Singapore Standard Time / Philippines
+ { 86, 225, 3977 }, // US Eastern Standard Time / UnitedStates
+ { 64, 8, 4044 }, // Pacific SA Standard Time / Antarctica
+ { 4, 223, 4062 }, // Arabian Standard Time / UnitedArabEmirates
+ { 75, 45, 4073 }, // SE Asia Standard Time / ChristmasIsland
+ { 91, 0, 4090 }, // UTC+12 / AnyCountry
+ { 40, 99, 4101 }, // Greenwich Standard Time / Iceland
+ { 88, 0, 4120 }, // UTC-02 / AnyCountry
+ { 66, 0, 4130 }, // Pacific Standard Time / AnyCountry
+ { 38, 75, 4138 }, // GMT Standard Time / Guernsey
+ { 96, 206, 4154 }, // W. Europe Standard Time / Switzerland
+ { 71, 70, 4168 }, // SA Eastern Standard Time / FalklandIslands
+ { 22, 54, 4185 }, // Central European Standard Time / Croatia
+ { 66, 139, 4199 }, // Pacific Standard Time / Mexico
+ { 82, 164, 4215 }, // Tokyo Standard Time / Palau
+ { 2, 225, 4229 }, // Alaskan Standard Time / UnitedStates
+ { 14, 38, 4305 }, // Canada Central Standard Time / Canada
+ { 57, 178, 4342 }, // N. Central Asia Standard Time / Russia
+ { 77, 146, 4387 }, // South Africa Standard Time / Mozambique
+ { 15, 39, 4401 }, // Cape Verde Standard Time / CapeVerde
+ { 71, 202, 4421 }, // SA Eastern Standard Time / Suriname
+ { 38, 252, 4440 }, // GMT Standard Time / Jersey
+ { 40, 189, 4454 }, // Greenwich Standard Time / SierraLeone
+ { 92, 231, 4470 }, // Venezuela Standard Time / Venezuela
+ { 73, 38, 4486 }, // SA Western Standard Time / Canada
+ { 79, 207, 4507 }, // Syria Standard Time / Syria
+ { 38, 197, 4521 }, // GMT Standard Time / Spain
+ { 75, 117, 4537 }, // SE Asia Standard Time / Laos
+ { 22, 172, 4552 }, // Central European Standard Time / Poland
+ { 27, 0, 4566 }, // Dateline Standard Time / AnyCountry
+ { 16, 11, 4577 }, // Caucasus Standard Time / Armenia
+ { 95, 50, 4590 }, // W. Central Africa Standard Time / CongoBrazzaville
+ { 76, 32, 4609 }, // Singapore Standard Time / Brunei
+ { 81, 13, 4621 }, // Tasmania Standard Time / Australia
+ { 96, 84, 4655 }, // W. Europe Standard Time / Gibraltar
+ { 72, 0, 4672 }, // SA Pacific Standard Time / AnyCountry
+ { 94, 8, 4682 }, // W. Australia Standard Time / Antarctica
+ { 82, 62, 4699 }, // Tokyo Standard Time / EastTimor
+ { 22, 27, 4709 }, // Central European Standard Time / BosniaAndHerzegowina
+ { 72, 94, 4725 }, // SA Pacific Standard Time / Haiti
+ { 64, 43, 4748 }, // Pacific SA Standard Time / Chile
+ { 66, 38, 4765 }, // Pacific Standard Time / Canada
+ { 91, 112, 4817 }, // UTC+12 / Kiribati
+ { 46, 109, 4832 }, // Jordan Standard Time / Jordan
+ { 84, 217, 4843 }, // Turkey Standard Time / Turkey
+ { 51, 119, 4859 }, // Middle East Standard Time / Lebanon
+ { 36, 124, 4871 }, // FLE Standard Time / Lithuania
+ { 21, 2, 4886 }, // Central Europe Standard Time / Albania
+ { 95, 23, 4900 }, // W. Central Africa Standard Time / Benin
+ { 55, 38, 4918 }, // Mountain Standard Time / Canada
+ { 11, 173, 4992 }, // Azores Standard Time / Portugal
+ { 28, 69, 5008 }, // E. Africa Standard Time / Ethiopia
+ { 19, 31, 5027 }, // Central Asia Standard Time / BritishIndianOceanTerritory
+ { 73, 256, 5041 }, // SA Western Standard Time / SintMaarten
+ { 38, 104, 5063 }, // GMT Standard Time / Ireland
+ { 89, 4, 5077 }, // UTC-11 / AmericanSamoa
+ { 77, 239, 5095 }, // South Africa Standard Time / Zambia
+ { 21, 98, 5109 }, // Central Europe Standard Time / Hungary
+ { 11, 86, 5125 }, // Azores Standard Time / Greenland
+ { 73, 215, 5146 }, // SA Western Standard Time / TrinidadAndTobago
+ { 77, 195, 5168 }, // South Africa Standard Time / SouthAfrica
+ { 13, 18, 5188 }, // Bangladesh Standard Time / Bangladesh
+ { 12, 30, 5199 }, // Bahia Standard Time / Brazil
+ { 47, 178, 5213 }, // Kaliningrad Standard Time / Russia
+ { 28, 201, 5232 }, // E. Africa Standard Time / Sudan
+ { 96, 125, 5248 }, // W. Europe Standard Time / Luxembourg
+ { 75, 143, 5266 }, // SE Asia Standard Time / Mongolia
+ { 98, 0, 5276 }, // West Pacific Standard Time / AnyCountry
+ { 50, 188, 5287 }, // Mauritius Standard Time / Seychelles
+ { 21, 57, 5299 }, // Central Europe Standard Time / CzechRepublic
+ { 98, 140, 5313 }, // West Pacific Standard Time / Micronesia
+ { 90, 86, 5326 }, // UTC / Greenland
+ { 43, 100, 5347 }, // India Standard Time / India
+ { 83, 214, 5361 }, // Tonga Standard Time / Tonga
+ { 96, 142, 5379 }, // W. Europe Standard Time / Monaco
+ { 73, 181, 5393 }, // SA Western Standard Time / SaintLucia
+ { 95, 6, 5410 }, // W. Central Africa Standard Time / Angola
+ { 73, 60, 5424 }, // SA Western Standard Time / Dominica
+ { 88, 196, 5441 }, // UTC-02 / SouthGeorgiaAndTheSouthSandwichIslands
+ { 19, 0, 5464 }, // Central Asia Standard Time / AnyCountry
+ { 77, 28, 5474 }, // South Africa Standard Time / Botswana
+ { 21, 242, 5490 }, // Central Europe Standard Time / Montenegro
+ { 98, 89, 5507 }, // West Pacific Standard Time / Guam
+ { 55, 225, 5520 }, // Mountain Standard Time / UnitedStates
+ { 53, 145, 5566 }, // Morocco Standard Time / Morocco
+ { 77, 179, 5584 }, // South Africa Standard Time / Rwanda
+ { 7, 86, 5598 }, // Atlantic Standard Time / Greenland
+ { 30, 56, 5612 }, // E. Europe Standard Time / Cyprus
+ { 49, 178, 5625 }, // Magadan Standard Time / Russia
+ { 72, 169, 5665 }, // SA Pacific Standard Time / Peru
+ { 77, 204, 5678 }, // South Africa Standard Time / Swaziland
+ { 3, 17, 5693 }, // Arab Standard Time / Bahrain
+ { 73, 174, 5706 }, // SA Western Standard Time / PuertoRico
+ { 77, 49, 5726 }, // South Africa Standard Time / CongoKinshasa
+ { 75, 8, 5744 }, // SE Asia Standard Time / Antarctica
+ { 91, 149, 5761 }, // UTC+12 / Nauru
+ { 40, 83, 5775 }, // Greenwich Standard Time / Ghana
+ { 75, 211, 5788 }, // SE Asia Standard Time / Thailand
+ { 96, 230, 5801 }, // W. Europe Standard Time / VaticanCityState
+ { 71, 30, 5816 }, // SA Eastern Standard Time / Brazil
+ { 69, 58, 5913 }, // Romance Standard Time / Denmark
+ { 25, 225, 5931 }, // Central Standard Time / UnitedStates
+ { 73, 245, 6099 }, // SA Western Standard Time / Saint Martin
+ { 91, 134, 6115 }, // UTC+12 / MarshallIslands
+ { 45, 105, 6148 }, // Israel Standard Time / Israel
+ { 73, 12, 6163 }, // SA Western Standard Time / Aruba
+ { 67, 163, 6177 }, // Pakistan Standard Time / Pakistan
+ { 40, 185, 6190 }, // Greenwich Standard Time / SaoTomeAndPrincipe
+ { 48, 113, 6206 }, // Korea Standard Time / NorthKorea
+ { 93, 178, 6221 }, // Vladivostok Standard Time / Russia
+ { 40, 34, 6252 }, // Greenwich Standard Time / BurkinaFaso
+ { 77, 129, 6271 }, // South Africa Standard Time / Malawi
+ { 42, 51, 6287 }, // Hawaiian Standard Time / CookIslands
+ { 28, 0, 6305 }, // E. Africa Standard Time / AnyCountry
+ { 40, 53, 6315 }, // Greenwich Standard Time / IvoryCoast
+ { 38, 224, 6330 }, // GMT Standard Time / UnitedKingdom
+ { 18, 90, 6344 }, // Central America Standard Time / Guatemala
+ { 35, 72, 6362 }, // Fiji Standard Time / Fiji
+ { 72, 40, 6375 }, // SA Pacific Standard Time / CaymanIslands
+ { 62, 178, 6390 }, // North Asia East Standard Time / Russia
+ { 96, 106, 6403 }, // W. Europe Standard Time / Italy
+ { 50, 137, 6415 }, // Mauritius Standard Time / Mauritius
+ { 4, 0, 6432 }, // Arabian Standard Time / AnyCountry
+ { 71, 0, 6442 }, // SA Eastern Standard Time / AnyCountry
+ { 40, 91, 6452 }, // Greenwich Standard Time / Guinea
+ { 65, 139, 6467 }, // Pacific Standard Time (Mexico) / Mexico
+ { 40, 187, 6488 }, // Greenwich Standard Time / Senegal
+ { 83, 213, 6501 }, // Tonga Standard Time / Tokelau
+ { 96, 5, 6517 }, // W. Europe Standard Time / Andorra
+ { 96, 161, 6532 }, // W. Europe Standard Time / Norway
+ { 3, 175, 6544 }, // Arab Standard Time / Qatar
+ { 56, 147, 6555 }, // Myanmar Standard Time / Myanmar
+ { 97, 131, 6568 }, // West Asia Standard Time / Maldives
+ { 69, 74, 6584 }, // Romance Standard Time / France
+ { 3, 237, 6597 }, // Arab Standard Time / Yemen
+ { 63, 178, 6607 }, // North Asia Standard Time / Russia
+ { 96, 14, 6624 }, // W. Europe Standard Time / Austria
+ { 76, 0, 6638 }, // Singapore Standard Time / AnyCountry
+ { 83, 0, 6648 }, // Tonga Standard Time / AnyCountry
+ { 96, 203, 6659 }, // W. Europe Standard Time / SvalbardAndJanMayenIslands
+ { 73, 87, 6679 }, // SA Western Standard Time / Grenada
+ { 73, 234, 6695 }, // SA Western Standard Time / UnitedStatesVirginIslands
+ { 33, 165, 6713 }, // Egypt Standard Time / PalestinianTerritories
+ { 99, 178, 6735 }, // Yakutsk Standard Time / Russia
+ { 21, 191, 6748 }, // Central Europe Standard Time / Slovakia
+ { 23, 0, 6766 }, // Central Pacific Standard Time / AnyCountry
+ { 95, 66, 6777 }, // W. Central Africa Standard Time / EquatorialGuinea
+ { 73, 255, 6791 }, // SA Western Standard Time / Bonaire
+ { 97, 0, 6810 }, // West Asia Standard Time / AnyCountry
+ { 22, 127, 6820 }, // Central European Standard Time / Macedonia
+ { 95, 42, 6834 }, // W. Central Africa Standard Time / Chad
+ { 19, 116, 6850 }, // Central Asia Standard Time / Kyrgyzstan
+ { 0, 0, 0 } // Trailing zeroes
+};
+
+// Windows ID Key, Windows ID Index, Olsen ID Index, UTC Offset
+static const QWindowsData windowsDataTable[] = {
+ { 1, 0, 997, 16200 }, // Afghanistan Standard Time
+ { 2, 26, 6863,-32400 }, // Alaskan Standard Time
+ { 3, 48, 2031, 10800 }, // Arab Standard Time
+ { 4, 67, 4062, 14400 }, // Arabian Standard Time
+ { 5, 89, 1985, 10800 }, // Arabic Standard Time
+ { 6, 110, 6881, 10800 }, // Argentina Standard Time
+ { 7, 134, 6902,-14400 }, // Atlantic Standard Time
+ { 8, 157, 3854, 34200 }, // AUS Central Standard Time
+ { 9, 183, 6918, 36000 }, // AUS Eastern Standard Time
+ { 10, 209, 3844, 14400 }, // Azerbaijan Standard Time
+ { 11, 234, 4992, -3600 }, // Azores Standard Time
+ { 12, 255, 5199, 10800 }, // Bahia Standard Time
+ { 13, 275, 5188, 21600 }, // Bangladesh Standard Time
+ { 14, 300, 6935,-21600 }, // Canada Central Standard Time
+ { 15, 329, 4401, -3600 }, // Cape Verde Standard Time
+ { 16, 354, 4577, 14400 }, // Caucasus Standard Time
+ { 17, 377, 6950, 34200 }, // Cen. Australia Standard Time
+ { 18, 406, 6344,-21600 }, // Central America Standard Time
+ { 19, 436, 6969, 21600 }, // Central Asia Standard Time
+ { 20, 463, 6981,-14400 }, // Central Brazilian Standard Time
+ { 21, 495, 5109, 3600 }, // Central Europe Standard Time
+ { 22, 524, 4552, 3600 }, // Central European Standard Time
+ { 23, 555, 3927, 39600 }, // Central Pacific Standard Time
+ { 24, 585, 6996,-21600 }, // Central Standard Time (Mexico)
+ { 25, 616, 7016,-21600 }, // Central Standard Time
+ { 26, 638, 7032, 28800 }, // China Standard Time
+ { 27, 658, 4566,-43200 }, // Dateline Standard Time
+ { 28, 681, 1615, 10800 }, // E. Africa Standard Time
+ { 29, 705, 7046, 36000 }, // E. Australia Standard Time
+ { 30, 732, 5612, 7200 }, // E. Europe Standard Time
+ { 31, 756, 1362,-10800 }, // E. South America Standard Time
+ { 32, 787, 7065,-18000 }, // Eastern Standard Time
+ { 33, 809, 2643, 7200 }, // Egypt Standard Time
+ { 34, 829, 2784, 21600 }, // Ekaterinburg Standard Time
+ { 35, 856, 6362, 43200 }, // Fiji Standard Time
+ { 36, 875, 7082, 7200 }, // FLE Standard Time
+ { 37, 893, 2362, 14400 }, // Georgian Standard Time
+ { 38, 916, 6330, 0 }, // GMT Standard Time
+ { 39, 934, 1814, 10800 }, // Greenland Standard Time
+ { 40, 958, 4101, 0 }, // Greenwich Standard Time
+ { 41, 982, 1008, 7200 }, // GTB Standard Time
+ { 42, 1000, 2109,-36000 }, // Hawaiian Standard Time
+ { 43, 1023, 5347, 19800 }, // India Standard Time
+ { 44, 1043, 2043, 12600 }, // Iran Standard Time
+ { 45, 1062, 6148, 7200 }, // Israel Standard Time
+ { 46, 1083, 4832, 7200 }, // Jordan Standard Time
+ { 47, 1104, 5213, 10800 }, // Kaliningrad Standard Time
+ { 48, 1130, 849, 32400 }, // Korea Standard Time
+ { 49, 1150, 7094, 43200 }, // Magadan Standard Time
+ { 50, 1172, 6415, 14400 }, // Mauritius Standard Time
+ { 51, 1196, 4859, 7200 }, // Middle East Standard Time
+ { 52, 1222, 1106, 10800 }, // Montevideo Standard Time
+ { 53, 1247, 5566, 0 }, // Morocco Standard Time
+ { 54, 1269, 7107,-25200 }, // Mountain Standard Time (Mexico)
+ { 55, 1301, 7125,-25200 }, // Mountain Standard Time
+ { 56, 1324, 6555, 23400 }, // Myanmar Standard Time
+ { 57, 1346, 7140, 23400 }, // N. Central Asia Standard Time
+ { 58, 1376, 2768, 3600 }, // Namibia Standard Time
+ { 59, 1398, 3645, 20700 }, // Nepal Standard Time
+ { 60, 1418, 2626, 43200 }, // New Zealand Standard Time
+ { 61, 1444, 257,-12600 }, // Newfoundland Standard Time
+ { 62, 1471, 6390, 32400 }, // North Asia East Standard Time
+ { 63, 1501, 6607, 28800 }, // North Asia Standard Time
+ { 64, 1526, 4748,-14400 }, // Pacific SA Standard Time
+ { 65, 1551, 6467,-28800 }, // Pacific Standard Time (Mexico)
+ { 66, 1582, 3430,-28800 }, // Pacific Standard Time
+ { 67, 1604, 6177, 18000 }, // Pakistan Standard Time
+ { 68, 1627, 3380,-14400 }, // Paraguay Standard Time
+ { 69, 1650, 6584, 3600 }, // Romance Standard Time
+ { 70, 1672, 7157, 14400 }, // Russian Standard Time
+ { 71, 1694, 3751, 10800 }, // SA Eastern Standard Time
+ { 72, 1719, 228,-18000 }, // SA Pacific Standard Time
+ { 73, 1744, 1025,-14400 }, // SA Western Standard Time
+ { 74, 1769, 2613, 46800 }, // Samoa Standard Time
+ { 75, 1789, 5788, 23400 }, // SE Asia Standard Time
+ { 76, 1811, 2896, 28800 }, // Singapore Standard Time
+ { 77, 1835, 5168, 7200 }, // South Africa Standard Time
+ { 78, 1862, 3027, 19800 }, // Sri Lanka Standard Time
+ { 79, 1886, 4507, 7200 }, // Syria Standard Time
+ { 80, 1906, 142, 28800 }, // Taipei Standard Time
+ { 81, 1927, 7171, 36000 }, // Tasmania Standard Time
+ { 82, 1950, 1846, 32400 }, // Tokyo Standard Time
+ { 83, 1970, 5361, 46800 }, // Tonga Standard Time
+ { 84, 1990, 4843, 7200 }, // Turkey Standard Time
+ { 85, 2011, 7188, 28800 }, // Ulaanbaatar Standard Time
+ { 86, 2037, 7205,-18000 }, // US Eastern Standard Time
+ { 87, 2062, 1690,-25200 }, // US Mountain Standard Time
+ { 88, 2088, 4120, -7200 }, // UTC-02
+ { 89, 2095, 3472,-39600 }, // UTC-11
+ { 90, 2102, 927, 0 }, // UTC
+ { 91, 2106, 4090, 43200 }, // UTC+12
+ { 92, 2113, 4470,-16200 }, // Venezuela Standard Time
+ { 93, 2137, 7226, 39600 }, // Vladivostok Standard Time
+ { 94, 2163, 870, 28800 }, // W. Australia Standard Time
+ { 95, 2190, 0, 3600 }, // W. Central Africa Standard Time
+ { 96, 2222, 3416, 3600 }, // W. Europe Standard Time
+ { 97, 2246, 7243, 18000 }, // West Asia Standard Time
+ { 98, 2270, 2449, 36000 }, // West Pacific Standard Time
+ { 99, 2297, 6735, 36000 }, // Yakutsk Standard Time
+ { 0, 0, 0, 0 } // Trailing zeroes
+};
+
+// Olsen ID Index, UTC Offset
+static const QUtcData utcDataTable[] = {
+ { 7257, 0 }, // UTC
+ { 7261,-50400 }, // UTC-14:00
+ { 7271,-46800 }, // UTC-13:00
+ { 7281,-43200 }, // UTC-12:00
+ { 7291,-39600 }, // UTC-11:00
+ { 7301,-36000 }, // UTC-10:00
+ { 7311,-32400 }, // UTC-09:00
+ { 7321,-28800 }, // UTC-08:00
+ { 7331,-25200 }, // UTC-07:00
+ { 7341,-21600 }, // UTC-06:00
+ { 7351,-18000 }, // UTC-05:00
+ { 7361,-16200 }, // UTC-04:30
+ { 7371,-14400 }, // UTC-04:00
+ { 7381,-12600 }, // UTC-03:30
+ { 7391,-10800 }, // UTC-03:00
+ { 7401, -7200 }, // UTC-02:00
+ { 7411, -3600 }, // UTC-01:00
+ { 7421, 0 }, // UTC-00:00
+ { 7431, 0 }, // UTC+00:00
+ { 7441, 3600 }, // UTC+01:00
+ { 7451, 7200 }, // UTC+02:00
+ { 7461, 10800 }, // UTC+03:00
+ { 7471, 12600 }, // UTC+03:30
+ { 7481, 14400 }, // UTC+04:00
+ { 7491, 16200 }, // UTC+04:30
+ { 7501, 18000 }, // UTC+05:00
+ { 7511, 19800 }, // UTC+05:30
+ { 7521, 20700 }, // UTC+05:45
+ { 7531, 21600 }, // UTC+06:00
+ { 7541, 23400 }, // UTC+06:30
+ { 7551, 25200 }, // UTC+07:00
+ { 7561, 28800 }, // UTC+08:00
+ { 7571, 32400 }, // UTC+09:00
+ { 7581, 34200 }, // UTC+09:30
+ { 7591, 36000 }, // UTC+10:00
+ { 7601, 39600 }, // UTC+11:00
+ { 7611, 43200 }, // UTC+12:00
+ { 7621, 46800 }, // UTC+13:00
+ { 7631, 50400 }, // UTC+14:00
+ { 0, 0 } // Trailing zeroes
+};
+
+static const char windowsIdData[] = {
+0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x61, 0x73, 0x6b, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74,
+0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x55, 0x53,
+0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x41, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x65, 0x72, 0x62, 0x61, 0x69, 0x6a, 0x61, 0x6e, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x68, 0x69, 0x61,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x6e, 0x67, 0x6c,
+0x61, 0x64, 0x65, 0x73, 0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x70, 0x65, 0x20, 0x56, 0x65, 0x72, 0x64, 0x65, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x75, 0x63, 0x61, 0x73,
+0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e,
+0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74,
+0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, 0x69, 0x61, 0x6e,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72,
+0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72,
+0x61, 0x6c, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x43, 0x65, 0x6e, 0x74,
+0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x68,
+0x69, 0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x44, 0x61,
+0x74, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x45, 0x2e, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x53,
+0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x67, 0x79, 0x70, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72,
+0x67, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x69, 0x6a, 0x69,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x4c, 0x45, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61,
+0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x4d, 0x54, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x6c,
+0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72,
+0x65, 0x65, 0x6e, 0x77, 0x69, 0x63, 0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x47, 0x54, 0x42, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
+0x48, 0x61, 0x77, 0x61, 0x69, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x49, 0x72, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x4a, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75,
+0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x69, 0x64, 0x64,
+0x6c, 0x65, 0x20, 0x45, 0x61, 0x73, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29,
+0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x4d, 0x79, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69,
+0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x61, 0x6d, 0x69,
+0x62, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65,
+0x70, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65,
+0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69,
+0x61, 0x20, 0x45, 0x61, 0x73, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
+0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x41, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53,
+0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f,
+0x29, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x53, 0x74,
+0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x20,
+0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x45, 0x61, 0x73,
+0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53,
+0x41, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
+0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
+0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x45, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65,
+0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x6f, 0x75, 0x74, 0x68,
+0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x53, 0x72, 0x69, 0x20, 0x4c, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x79, 0x72, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x73, 0x6d, 0x61, 0x6e, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x20, 0x53, 0x74, 0x61,
+0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74,
+0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x53, 0x20,
+0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x55, 0x53, 0x20, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31,
+0x31, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x0, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65,
+0x6c, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x56, 0x6c, 0x61,
+0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
+0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c,
+0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
+0x65, 0x0, 0x57, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
+0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x59, 0x61, 0x6b,
+0x75, 0x74, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0
+};
+
+static const char olsenIdData[] = {
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x6e, 0x67, 0x5f, 0x4b,
+0x6f, 0x6e, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x75, 0x72,
+0x79, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x79, 0x61,
+0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61,
+0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
+0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69,
+0x61, 0x2f, 0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
+0x2f, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x48, 0x69, 0x6c, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x67, 0x6f,
+0x74, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61,
+0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f,
+0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x41, 0x71, 0x74, 0x6f, 0x62, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74,
+0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72,
+0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61,
+0x2f, 0x4c, 0x61, 0x5f, 0x52, 0x69, 0x6f, 0x6a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72,
+0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x47, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53,
+0x61, 0x6c, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
+0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4a, 0x75, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4c, 0x75, 0x69, 0x73, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x54, 0x75, 0x63,
+0x75, 0x6d, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
+0x6e, 0x61, 0x2f, 0x55, 0x73, 0x68, 0x75, 0x61, 0x69, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72,
+0x64, 0x6f, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x64, 0x6f, 0x7a, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61,
+0x6d, 0x70, 0x6f, 0x5f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69,
+0x6e, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x20,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, 0x61, 0x6c, 0x75, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e,
+0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75,
+0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0,
+0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f,
+0x50, 0x65, 0x72, 0x74, 0x68, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x6f, 0x75,
+0x74, 0x68, 0x5f, 0x50, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d,
+0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64,
+0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0,
+0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61,
+0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f,
+0x70, 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x74,
+0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48,
+0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76,
+0x69, 0x64, 0x65, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61,
+0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55,
+0x72, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68,
+0x61, 0x6d, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, 0x67,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x69, 0x6e, 0x79, 0x5f, 0x52, 0x69, 0x76, 0x65, 0x72,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x5f, 0x49, 0x6e, 0x6c, 0x65,
+0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61,
+0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x6e, 0x67,
+0x71, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x62, 0x69, 0x6e, 0x20, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x4b, 0x61, 0x73, 0x68, 0x67, 0x61, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, 0x6d, 0x71,
+0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61,
+0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e,
+0x64, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74,
+0x69, 0x63, 0x61, 0x2f, 0x53, 0x79, 0x6f, 0x77, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66,
+0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64,
+0x6f, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, 0x6d, 0x70, 0x75, 0x72,
+0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
+0x54, 0x2b, 0x34, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56,
+0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x64, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x69, 0x75,
+0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x69, 0x6c, 0x6c, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61,
+0x69, 0x70, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68,
+0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68,
+0x6f, 0x65, 0x6e, 0x69, 0x78, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66,
+0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, 0x65, 0x0, 0x50, 0x61,
+0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69,
+0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x36, 0x0,
+0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x66, 0x61, 0x74, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46,
+0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67,
+0x6f, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x47, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47,
+0x6f, 0x6f, 0x73, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e,
+0x63, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61,
+0x64, 0x68, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47,
+0x4d, 0x54, 0x2d, 0x37, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e,
+0x6f, 0x6c, 0x75, 0x6c, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f,
+0x75, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x5f, 0x43, 0x72,
+0x65, 0x65, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x2f, 0x50, 0x6f, 0x6e, 0x61, 0x70, 0x65, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x6f,
+0x73, 0x72, 0x61, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61,
+0x6e, 0x6a, 0x75, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61,
+0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e,
+0x61, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72,
+0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f,
+0x56, 0x69, 0x73, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65,
+0x70, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c,
+0x68, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63,
+0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61,
+0x6e, 0x74, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
+0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61,
+0x6e, 0x64, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74,
+0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73,
+0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0, 0x50, 0x61, 0x63, 0x69,
+0x66, 0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x44, 0x61, 0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68,
+0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75,
+0x72, 0x67, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x49, 0x6e,
+0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65,
+0x6c, 0x65, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61,
+0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31,
+0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x5f, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x73, 0x20, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x65, 0x72, 0x69, 0x64, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e,
+0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0,
+0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53,
+0x69, 0x6d, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x7a, 0x68,
+0x67, 0x6f, 0x72, 0x6f, 0x64, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a,
+0x68, 0x79, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62,
+0x75, 0x72, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f,
+0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e,
+0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c,
+0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65,
+0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x20, 0x41, 0x75,
+0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4d, 0x65, 0x6c, 0x62, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x0, 0x45, 0x53,
+0x54, 0x35, 0x45, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72,
+0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
+0x54, 0x2d, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f,
+0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f,
+0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61,
+0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x31, 0x31, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f,
+0x42, 0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c,
+0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c,
+0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61,
+0x77, 0x73, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61,
+0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, 0x73, 0x63, 0x61, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x43, 0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c,
+0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x6e, 0x74,
+0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c,
+0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x77, 0x69, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x41, 0x6e,
+0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6a,
+0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x61,
+0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61, 0x70,
+0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67,
+0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65,
+0x76, 0x61, 0x79, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d, 0x65,
+0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x62, 0x61, 0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f,
+0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32,
+0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0,
+0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x32, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x45, 0x75,
+0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
+0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61,
+0x6e, 0x6c, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x2f, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63,
+0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6e, 0x65, 0x61,
+0x75, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x6d, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x53, 0x69, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x61, 0x6b,
+0x75, 0x74, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x20,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e,
+0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x20, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f,
+0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0,
+0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61,
+0x72, 0x61, 0x63, 0x61, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d,
+0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73,
+0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x57,
+0x61, 0x72, 0x73, 0x61, 0x77, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x32, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61,
+0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69,
+0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75,
+0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x72, 0x69, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
+0x65, 0x2f, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
+0x35, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61,
+0x6a, 0x65, 0x76, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75,
+0x2d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74,
+0x69, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, 0x6f, 0x75, 0x76,
+0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x20, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x0, 0x50, 0x61, 0x63,
+0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72, 0x61, 0x77, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d,
+0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0, 0x41,
+0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69,
+0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0,
+0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76, 0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63,
+0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x73,
+0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63,
+0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63,
+0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61,
+0x70, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62,
+0x79, 0x73, 0x75, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f,
+0x66, 0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e,
+0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b,
+0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d,
+0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0, 0x45, 0x74, 0x63, 0x2f,
+0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x68, 0x65, 0x0, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
+0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72,
+0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61,
+0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0, 0x45,
+0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x53, 0x74, 0x5f, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61,
+0x6e, 0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61,
+0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72,
+0x67, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x6f, 0x64,
+0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x68, 0x69,
+0x70, 0x72, 0x6f, 0x63, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61,
+0x6e, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x0, 0x41, 0x6d,
+0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63,
+0x6f, 0x73, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x41, 0x73,
+0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68,
+0x61, 0x74, 0x6b, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x41, 0x66,
+0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61,
+0x68, 0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f,
+0x5f, 0x52, 0x69, 0x63, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61,
+0x73, 0x68, 0x69, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73,
+0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b,
+0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x41, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x42, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f,
+0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x63, 0x69, 0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
+0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61,
+0x6e, 0x61, 0x2f, 0x4b, 0x6e, 0x6f, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69,
+0x61, 0x6e, 0x61, 0x2f, 0x54, 0x65, 0x6c, 0x6c, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
+0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20,
+0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61,
+0x2f, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74,
+0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x53, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
+0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77,
+0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c,
+0x65, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f,
+0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67,
+0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x41, 0x73,
+0x69, 0x61, 0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f,
+0x75, 0x61, 0x67, 0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c,
+0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74,
+0x6f, 0x6e, 0x67, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
+0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e,
+0x64, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c,
+0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74,
+0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61,
+0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d,
+0x34, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
+0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61,
+0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72,
+0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f,
+0x73, 0x6c, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69,
+0x76, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69,
+0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61,
+0x72, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x0, 0x45, 0x74,
+0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x41,
+0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x41,
+0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61,
+0x7a, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
+0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x61, 0x74, 0x69,
+0x73, 0x6c, 0x61, 0x76, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x66, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b,
+0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0,
+0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b,
+0x65, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65,
+0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x0, 0x41, 0x75,
+0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
+0x63, 0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f,
+0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79,
+0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72,
+0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61,
+0x6e, 0x67, 0x68, 0x61, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73,
+0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72,
+0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d,
+0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75,
+0x61, 0x68, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x0,
+0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72,
+0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
+0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61,
+0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61,
+0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74,
+0x6f, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, 0x55, 0x54, 0x43,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x33, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x37, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x35, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x31, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x30, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x33, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x33, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x33, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x34, 0x35, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x37, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30, 0x30,
+0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x34, 0x3a, 0x30, 0x30,
+0x0
+};
+// GENERATED PART ENDS HERE
+
+QT_END_NAMESPACE
+
+#endif // QTIMEZONEPRIVATE_DATA_P_H
diff --git a/src/corelib/tools/qtimezoneprivate_p.h b/src/corelib/tools/qtimezoneprivate_p.h
new file mode 100644
index 0000000000..94fb49026f
--- /dev/null
+++ b/src/corelib/tools/qtimezoneprivate_p.h
@@ -0,0 +1,198 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 John Layt <jlayt@kde.org>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QTIMEZONEPRIVATE_P_H
+#define QTIMEZONEPRIVATE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qtimezone.h"
+#include "qlocale_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q_CORE_EXPORT QTimeZonePrivate : public QSharedData
+{
+public:
+ //Version of QTimeZone::OffsetData struct using msecs for efficiency
+ struct Data {
+ QString abbreviation;
+ qint64 atMSecsSinceEpoch;
+ int offsetFromUtc;
+ int standardTimeOffset;
+ int daylightTimeOffset;
+ };
+ typedef QVector<Data> DataList;
+
+ // Create null time zone
+ QTimeZonePrivate();
+ QTimeZonePrivate(const QTimeZonePrivate &other);
+ virtual ~QTimeZonePrivate();
+
+ virtual QTimeZonePrivate *clone();
+
+ bool operator==(const QTimeZonePrivate &other) const;
+ bool operator!=(const QTimeZonePrivate &other) const;
+
+ bool isValid() const;
+
+ QByteArray id() const;
+ virtual QLocale::Country country() const;
+ virtual QString comment() const;
+
+ virtual QString displayName(qint64 atMSecsSinceEpoch,
+ QTimeZone::NameType nameType,
+ const QLocale &locale) const;
+ virtual QString displayName(QTimeZone::TimeType timeType,
+ QTimeZone::NameType nameType,
+ const QLocale &locale) const;
+ virtual QString abbreviation(qint64 atMSecsSinceEpoch) const;
+
+ virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const;
+ virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const;
+ virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const;
+
+ virtual bool hasDaylightTime() const;
+ virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
+
+ virtual Data data(qint64 forMSecsSinceEpoch) const;
+
+ virtual bool hasTransitions() const;
+ virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const;
+ virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const;
+ DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const;
+
+ virtual QByteArray systemTimeZoneId() const;
+
+ virtual QSet<QByteArray> availableTimeZoneIds() const;
+ virtual QSet<QByteArray> availableTimeZoneIds(QLocale::Country country) const;
+ virtual QSet<QByteArray> availableTimeZoneIds(int utcOffset) const;
+
+ virtual void serialize(QDataStream &ds) const;
+
+ // Static Utility Methods
+ static inline qint64 maxMSecs() { return std::numeric_limits<qint64>::max(); }
+ static inline qint64 minMSecs() { return std::numeric_limits<qint64>::min() + 1; }
+ static inline qint64 invalidMSecs() { return std::numeric_limits<qint64>::min(); }
+ static inline qint64 invalidSeconds() { return std::numeric_limits<int>::min(); }
+ static Data invalidData();
+ static QTimeZone::OffsetData invalidOffsetData();
+ static QTimeZone::OffsetData toOffsetData(const Data &data);
+ static bool isValidId(const QByteArray &olsenId);
+ static QString isoOffsetFormat(int offsetFromUtc);
+
+ static QByteArray olsenIdToWindowsId(const QByteArray &olsenId);
+ static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId);
+ static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId,
+ QLocale::Country country);
+ static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId);
+ static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId,
+ QLocale::Country country);
+
+protected:
+ QByteArray m_id;
+};
+
+template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone();
+
+class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate Q_DECL_FINAL : public QTimeZonePrivate
+{
+public:
+ // Create default UTC time zone
+ QUtcTimeZonePrivate();
+ // Create named time zone
+ QUtcTimeZonePrivate(const QByteArray &utcId);
+ // Create offset from UTC
+ QUtcTimeZonePrivate(int offsetSeconds);
+ // Create custom offset from UTC
+ QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
+ const QString &abbreviation, QLocale::Country country,
+ const QString &comment);
+ QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
+ virtual ~QUtcTimeZonePrivate();
+
+ QTimeZonePrivate *clone();
+
+ QLocale::Country country() const Q_DECL_OVERRIDE;
+ QString comment() const Q_DECL_OVERRIDE;
+
+ QString displayName(QTimeZone::TimeType timeType,
+ QTimeZone::NameType nameType,
+ const QLocale &locale) const Q_DECL_OVERRIDE;
+ QString abbreviation(qint64 atMSecsSinceEpoch) const Q_DECL_OVERRIDE;
+
+ int standardTimeOffset(qint64 atMSecsSinceEpoch) const Q_DECL_OVERRIDE;
+ int daylightTimeOffset(qint64 atMSecsSinceEpoch) const Q_DECL_OVERRIDE;
+
+ QByteArray systemTimeZoneId() const Q_DECL_OVERRIDE;
+
+ QSet<QByteArray> availableTimeZoneIds() const Q_DECL_OVERRIDE;
+ QSet<QByteArray> availableTimeZoneIds(QLocale::Country country) const Q_DECL_OVERRIDE;
+ QSet<QByteArray> availableTimeZoneIds(int utcOffset) const Q_DECL_OVERRIDE;
+
+ void serialize(QDataStream &ds) const Q_DECL_OVERRIDE;
+
+private:
+ void init(const QByteArray &zoneId);
+ void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
+ const QString &abbreviation, QLocale::Country country,
+ const QString &comment);
+
+ int m_offsetFromUtc;
+ QString m_name;
+ QString m_abbreviation;
+ QLocale::Country m_country;
+ QString m_comment;
+};
+
+QT_END_NAMESPACE
+
+#endif // QTIMEZONEPRIVATE_P_H
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 1f8641c312..5633b638d3 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -59,6 +59,9 @@ HEADERS += \
tools/qstringmatcher.h \
tools/qtextboundaryfinder.h \
tools/qtimeline.h \
+ tools/qtimezone.h \
+ tools/qtimezoneprivate_p.h \
+ tools/qtimezoneprivate_data_p.h \
tools/qelapsedtimer.h \
tools/qunicodetables_p.h \
tools/qunicodetools_p.h \
@@ -104,6 +107,8 @@ SOURCES += \
tools/qstringlist.cpp \
tools/qtextboundaryfinder.cpp \
tools/qtimeline.cpp \
+ tools/qtimezone.cpp \
+ tools/qtimezoneprivate.cpp \
tools/qunicodetools.cpp \
tools/qvector.cpp \
tools/qvsnprintf.cpp