summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrgrimes <rgrimes@FreeBSD.org>1994-05-30 19:09:18 +0000
committerrgrimes <rgrimes@FreeBSD.org>1994-05-30 19:09:18 +0000
commit47abdf90aee2335a06750aa4a6252264e8a6877d (patch)
tree9136bcfb3fcf9f49713585a0a99a23c6c7c8a0b8
downloadFreeBSD-src-47abdf90aee2335a06750aa4a6252264e8a6877d.zip
FreeBSD-src-47abdf90aee2335a06750aa4a6252264e8a6877d.tar.gz
BSD 4.4 Lite Share Sources
-rw-r--r--share/zoneinfo/Makefile138
-rw-r--r--share/zoneinfo/datfiles/africa43
-rw-r--r--share/zoneinfo/datfiles/antarctica4
-rw-r--r--share/zoneinfo/datfiles/asia262
-rw-r--r--share/zoneinfo/datfiles/australasia110
-rw-r--r--share/zoneinfo/datfiles/etcetera55
-rw-r--r--share/zoneinfo/datfiles/europe224
-rw-r--r--share/zoneinfo/datfiles/factory8
-rw-r--r--share/zoneinfo/datfiles/leapseconds31
-rw-r--r--share/zoneinfo/datfiles/northamerica321
-rw-r--r--share/zoneinfo/datfiles/pacificnew21
-rw-r--r--share/zoneinfo/datfiles/solar87386
-rw-r--r--share/zoneinfo/datfiles/solar88386
-rw-r--r--share/zoneinfo/datfiles/solar89391
-rw-r--r--share/zoneinfo/datfiles/southamerica103
-rw-r--r--share/zoneinfo/datfiles/systemv35
-rw-r--r--share/zoneinfo/datfiles/usno1988111
-rw-r--r--share/zoneinfo/datfiles/usno1989452
-rw-r--r--share/zoneinfo/ialloc.c140
-rw-r--r--share/zoneinfo/scheck.c99
-rw-r--r--share/zoneinfo/tzfile.5162
-rw-r--r--share/zoneinfo/zic.8424
-rw-r--r--share/zoneinfo/zic.c1892
23 files changed, 5798 insertions, 0 deletions
diff --git a/share/zoneinfo/Makefile b/share/zoneinfo/Makefile
new file mode 100644
index 0000000..710c0d2
--- /dev/null
+++ b/share/zoneinfo/Makefile
@@ -0,0 +1,138 @@
+# @(#)Makefile 8.1 (Berkeley) 6/8/93
+
+# Change the line below for your time zone (after finding the zone you want in
+# the time zone files, or adding it to a time zone file).
+# Alternately, if you discover you've got the wrong time zone, you can just
+# zic -l rightzone
+
+LOCALTIME= US/Pacific
+
+# If you want something other than Eastern United States time as a template
+# for handling POSIX-style time zone environment variables,
+# change the line below (after finding the zone you want in the
+# time zone files, or adding it to a time zone file).
+# Alternately, if you discover you've got the wrong time zone, you can just
+# zic -p rightzone
+
+POSIXRULES= US/Pacific
+
+# Use an absolute path name for TZDIR unless you're just testing the software.
+
+TZDIR= ${DESTDIR}/usr/share/zoneinfo
+
+# If you always want time values interpreted as "seconds since the epoch
+# (not counting leap seconds)", use
+# REDO= posix_only
+# below. If you always want right time values interpreted as "seconds since
+# the epoch" (counting leap seconds)", use
+# REDO= right_only
+# below. If you want both sets of data available, with leap seconds not
+# counted normally, use
+# REDO= posix_right
+# below. If you want both sets of data available, with leap seconds counted
+# normally, use
+# REDO= right_posix
+# below.
+
+REDO= right_only
+
+# If you're running on a System V-style system and don't want lint grief,
+# add
+# -DUSG
+# to the end of the "CFLAGS=" line.
+#
+# If you're running on a system where "strchr" is known as "index",
+# (for example, a 4.[012]BSD system), add
+# -Dstrchr=index
+# to the end of the "CFLAGS=" line.
+#
+# If you're running on a system with a "mkdir" function, feel free to add
+# -Demkdir=mkdir
+# to the end of the "CFLAGS=" line
+#
+# If you want to use System V compatibility code, add
+# -DUSG_COMPAT
+# to the end of the "CFLAGS=" line.
+#
+# If your system has a "GMT offset" field in its "struct tm"s
+# (or if you decide to add such a field in your system's "time.h" file),
+# add the name to a define such as
+# -DTM_GMTOFF=tm_gmtoff
+# or
+# -DTM_GMTOFF=_tm_gmtoff
+# to the end of the "CFLAGS=" line.
+#
+# If your system has a "GMT offset" field in its "struct tm"s
+# (or if you decide to add such a field in your system's "time.h" file),
+# add the name to a define such as
+# -DTM_ZONE=tm_zone
+# or
+# -DTM_ZONE=_tm_zone
+# to the end of the "CFLAGS=" line.
+#
+# If you want code inspired by certain emerging standards, add
+# -DSTD_INSPIRED
+# to the end of the "CFLAGS=" line.
+#
+# If you want Source Code Control System ID's left out of object modules, add
+# -DNOID
+# to the end of the "CFLAGS=" line.
+#
+# If you'll never want to handle solar-time-based time zones, add
+# -DNOSOLAR
+# to the end of the "CFLAGS=" line
+# (and comment out the "SDATA=" line below).
+#
+# If you want to allocate state structures in localtime, add
+# -DALL_STATE
+# to the end of the "CFLAGS=" line.
+#
+# If you want an "altzone" variable (a la System V Release 3.1), add
+# -DALTZONE
+# to the end of the "CFLAGS=" line.
+#
+# If you want a "gtime" function (a la MACH), add
+# -DCMUCS
+# to the end of the "CFLAGS=" line
+
+.PATH: ${.CURDIR}/datfiles
+CFLAGS= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone
+PROG= zic
+MAN5= tzfile.0
+
+SRCS= zic.c scheck.c ialloc.c
+
+YDATA= africa antarctica asia australasia europe northamerica \
+ southamerica pacificnew etcetera factory
+NDATA= systemv
+#SDATA= solar87 solar88 solar89
+TDATA= ${YDATA} ${NDATA} ${SDATA}
+DATA= ${YDATA} ${NDATA} ${SDATA} leapseconds
+USNO= usno1988 usno1989
+
+posix_only: ${TDATA}
+ (cd ${.CURDIR}/datfiles; \
+ ../obj/zic -d ${TZDIR} -L /dev/null ${TDATA})
+
+right_only: leapseconds ${TDATA}
+ (cd ${.CURDIR}/datfiles; \
+ ../obj/zic -d ${TZDIR} -L leapseconds ${TDATA})
+
+other_two: leapseconds ${TDATA}
+ (cd ${.CURDIR}/datfiles; \
+ ../obj/zic -d ${TZDIR}/posix -L /dev/null ${TDATA})
+ (cd ${.CURDIR}/datfiles; \
+ ../obj/zic -d ${TZDIR}/right -L leapseconds ${TDATA})
+
+posix_right: posix_only other_two
+
+right_posix: right_only other_two
+
+install: maninstall ${DATA} ${REDO}
+ (cd ${.CURDIR}/datfiles && ../obj/zic -d ${TZDIR} -p ${POSIXRULES})
+ install -c -o ${BINOWN} -g ${BINGRP} -m 444 \
+ ${TZDIR}/${LOCALTIME} ${DESTDIR}/etc/localtime
+ chown -R ${BINOWN}.${BINGRP} ${TZDIR}
+ chmod -R a-w ${TZDIR}
+
+.include <bsd.prog.mk>
diff --git a/share/zoneinfo/datfiles/africa b/share/zoneinfo/datfiles/africa
new file mode 100644
index 0000000..bed0252
--- /dev/null
+++ b/share/zoneinfo/datfiles/africa
@@ -0,0 +1,43 @@
+# @(#)africa 4.3
+
+###############################################################################
+
+# Egypt
+
+# From Bob Devine (January 28, 1988):
+# Egypt: DST from first day of May to first of October (ending may
+# also be on Sept 30th not 31st -- you might want to ask one of the
+# soc.* groups, you might hit someone who could ask an embassy).
+# DST since 1960 except for 1981-82.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# EGYPT 2 H AHEAD OF UTC
+# EGYPT 3 H AHEAD OF UTC MAY 17 - SEP 30 (AFTER
+# EGYPT RAMADAN)
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Egypt 1960 max - May 1 2:00 1:00 " DST"
+Rule Egypt 1960 max - Oct 1 2:00 0 -
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Egypt 2:00 Egypt EET%s 1981
+ 2:00 - EET 1983
+ 2:00 Egypt EET%s
+
+###############################################################################
+
+# Libya
+
+# From Bob Devine (January 28 1988):
+# Libya: Since 1982 April 1st to September 30th (?)
+
+# From U. S. Naval Observatory (January 19, 1989):
+# LIBYAN ARAB 1 H AHEAD OF UTC JAMAHIRIYA/LIBYA
+# LIBYAN ARAB 2 H AHEAD OF UTC APR 1 - SEP 30 JAMAHIRIYA/LIBYA
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Libya 1982 max - Apr 1 2:00 1:00 " DST"
+Rule Libya 1982 max - Sep 30 2:00 0 -
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Libya 2:00 Libya EET%s
diff --git a/share/zoneinfo/datfiles/antarctica b/share/zoneinfo/datfiles/antarctica
new file mode 100644
index 0000000..276dda1
--- /dev/null
+++ b/share/zoneinfo/datfiles/antarctica
@@ -0,0 +1,4 @@
+# @(#)antarctica 4.1
+
+# From Arthur David Olson (February 13, 1988):
+# No data available.
diff --git a/share/zoneinfo/datfiles/asia b/share/zoneinfo/datfiles/asia
new file mode 100644
index 0000000..13185b0
--- /dev/null
+++ b/share/zoneinfo/datfiles/asia
@@ -0,0 +1,262 @@
+# @(#)asia 7.1
+
+# From Guy Harris:
+# Incorporates data for Singapore from Robert Elz' asia 1.1, as well as
+# additional information from Tom Yap, Sun Microsystems Intercontinental
+# Technical Support (including a page from the Official Airline Guide -
+# Worldwide Edition). The names for time zones are guesses.
+
+###############################################################################
+
+# People's Republic of China
+
+# From Guy Harris:
+# People's Republic of China. Yes, they really have only one time zone.
+
+# From Bob Devine (January 28, 1988):
+# No they don't. See TIME mag, February 17, 1986 p.52. Even though
+# China is across 4 physical time zones, before Feb 1, 1986 only the
+# Peking (Bejing) time zone was recognized. Since that date, China
+# has two of 'em -- Peking's and Urumqi (named after the capital of
+# the Xinjiang Uighur Autonomous Region). I don't know about DST for it.
+#
+# . . .I just deleted the DST table and this editor makes it too
+# painful to suck in another copy.. So, here is what I have for
+# DST start/end dates for Peking's time zone (info from AP):
+#
+# 1986 May 4 - Sept 14
+# 1987 mid-April - ??
+
+# From U. S. Naval Observatory (January 19, 1989):
+# CHINA 8 H AHEAD OF UTC ALL OF CHINA, INCL TAIWAN
+# CHINA 9 H AHEAD OF UTC APR 17 - SEP 10
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule PRC 1970 max - Apr Sun<=14 2:00 1:00 D
+Rule PRC 1970 max - Sep Sun<=14 3:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone PRC 8:00 PRC C%sT
+
+###############################################################################
+
+# Republic of China
+
+# From Guy Harris
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone ROC 8:00 - CST
+
+###############################################################################
+
+# Hongkong
+
+# From Guy Harris
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Hongkong 8:00 - HKT
+
+###############################################################################
+
+# Iran
+
+# From Bob Devine (January 28, 1988):
+# Iran: Last Sunday in March to third (?) Sunday in
+# September. Since the revolution, the official calendar is Monarchic
+# calendar; I have no idea what the correspondence between dates are.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# IRAN 3.5H AHEAD OF UTC
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Iran 1988 max - Mar lastSun 2:00 1:00 D
+Rule Iran 1988 max - Sep Sun>=15 2:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Iran 3:30 Iran I%sT
+
+###############################################################################
+
+# Israel
+
+# From U. S. Naval Observatory (January 19, 1989):
+# ISRAEL 2 H AHEAD OF UTC
+# ISRAEL 3 H AHEAD OF UTC APR 10 - SEP 3
+
+# From Ephraim Silverberg (April 18, 1989):
+
+# Prior to 1989, the rules concerning Daylight Savings Time changed every
+# year; as information, regarding exact times and dates during this period,
+# is not readily available at the present time, the rules commence starting
+# with the year 1989.
+
+# From 1989 onwards the rules are as follows:
+#
+# 1. Daylight Savings Time commences midnight of the first Saturday night
+# following the seven-day festival of Pesach (Passover). The transition
+# is from midnight Israel Standard Time to 1 a.m. Israel Daylight Savings
+# time. As the Pesach festival is dependent on the Lunar calendar (the
+# first day is always on the 15th day of the month of Nisan), the rule
+# changes every year on the Gregorian calendar.
+#
+# 2. Standard Time is reinstated on the Saturday night whereupon Jews
+# following the Ashkenazi (European) rite begin to recite the Selichot
+# (forgiveness) prayers prior to the Jewish Lunar New Year. The transition
+# is from midnight Israel Daylight Savings time to 11 p.m. Israel Standard
+# Time. The law (according to the Ashkenazi custom) concerning the
+# commencement of the Selichot prayers is described in chapter 128, section
+# 5 of the "Code of Jewish Law," by Rabbi Shlomo Ganzfried (translated by
+# Hyman E. Goldin):
+#
+# Beginning with the Sunday [**] before Rosh Hashanah [***],
+# we rise early for the service of Selichot (supplications for
+# forgiveness). If Rosh Hashanah occurs on Monday or Tuesday, we
+# begin saying the Selichot from the Sunday of the preceding week.
+#
+# This, too, varies from year to year on the Gregorian calendar and, thus,
+# two explicit timezone rules are required for each Gregorian year.
+#
+# [**] actually Saturday night as the Jewish day commences at nightfall.
+# [***] the Jewish Lunar New Year.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Zion 1989 only - Apr 30 0:00 1:00 D
+Rule Zion 1989 only - Sep 24 0:00 0:00 S
+Rule Zion 1990 only - Apr 22 0:00 1:00 D
+Rule Zion 1990 only - Sep 16 0:00 0:00 S
+Rule Zion 1991 only - Apr 7 0:00 1:00 D
+Rule Zion 1991 only - Sep 1 0:00 0:00 S
+Rule Zion 1992 only - Apr 26 0:00 1:00 D
+Rule Zion 1992 only - Sep 20 0:00 0:00 S
+Rule Zion 1993 only - Apr 18 0:00 1:00 D
+Rule Zion 1993 only - Sep 12 0:00 0:00 S
+Rule Zion 1994 only - Apr 3 0:00 1:00 D
+Rule Zion 1994 only - Aug 28 0:00 0:00 S
+Rule Zion 1995 only - Apr 23 0:00 1:00 D
+Rule Zion 1995 only - Sep 17 0:00 0:00 S
+Rule Zion 1996 only - Apr 14 0:00 1:00 D
+Rule Zion 1996 only - Sep 8 0:00 0:00 S
+Rule Zion 1997 only - May 4 0:00 1:00 D
+Rule Zion 1997 only - Sep 28 0:00 0:00 S
+Rule Zion 1998 only - Apr 19 0:00 1:00 D
+Rule Zion 1998 only - Sep 13 0:00 0:00 S
+Rule Zion 1999 only - Apr 11 0:00 1:00 D
+Rule Zion 1999 only - Sep 5 0:00 0:00 S
+Rule Zion 2000 only - Apr 30 0:00 1:00 D
+Rule Zion 2000 only - Sep 24 0:00 0:00 S
+Rule Zion 2001 only - Apr 15 0:00 1:00 D
+Rule Zion 2001 only - Sep 9 0:00 0:00 S
+Rule Zion 2002 only - Apr 7 0:00 1:00 D
+Rule Zion 2002 only - Sep 1 0:00 0:00 S
+Rule Zion 2003 only - Apr 27 0:00 1:00 D
+Rule Zion 2003 only - Sep 21 0:00 0:00 S
+Rule Zion 2004 only - Apr 18 0:00 1:00 D
+Rule Zion 2004 only - Sep 12 0:00 0:00 S
+Rule Zion 2005 only - May 1 0:00 1:00 D
+Rule Zion 2005 only - Sep 25 0:00 0:00 S
+Rule Zion 2006 only - Apr 23 0:00 1:00 D
+Rule Zion 2006 only - Sep 17 0:00 0:00 S
+Rule Zion 2007 only - Apr 15 0:00 1:00 D
+Rule Zion 2007 only - Sep 9 0:00 0:00 S
+Rule Zion 2008 only - Apr 27 0:00 1:00 D
+Rule Zion 2008 only - Sep 21 0:00 0:00 S
+Rule Zion 2009 only - Apr 19 0:00 1:00 D
+Rule Zion 2009 only - Sep 13 0:00 0:00 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Israel 2:00 Zion I%sT
+
+# The following is a chart of the day of the week and Gregorian date of
+# the first day of Pesach and the first day of Rosh Hashanah for the years
+# 1989 through 2009 inclusive.
+#
+# First Day of Passover
+# ---------------------
+# Gregorian Year Day of Week Month Day
+# -------------- ----------- ----- ---
+# 1989 Thursday April 20
+# 1990 Tuesday April 10
+# 1991 Saturday March 30
+# 1992 Saturday April 18
+# 1993 Tuesday April 6
+# 1994 Sunday March 27
+# 1995 Saturday April 15
+# 1996 Thursday April 4
+# 1997 Tuesday April 22
+# 1998 Saturday April 11
+# 1999 Thursday April 1
+# 2000 Thursday April 20
+# 2001 Sunday April 8
+# 2002 Thursday March 28
+# 2003 Thursday April 17
+# 2004 Tuesday April 6
+# 2005 Sunday April 24
+# 2006 Thursday April 13
+# 2007 Tuesday April 3
+# 2008 Sunday April 20
+# 2009 Thursday April 9
+#
+# First Day of Rosh Hashanah
+# --------------------------
+# Gregorian Year Day of Week Month Day
+# -------------- ----------- ----- ---
+# 1989 Saturday September 30
+# 1990 Thursday September 20
+# 1991 Monday September 9
+# 1992 Monday September 28
+# 1993 Thursday September 16
+# 1994 Tuesday September 6
+# 1995 Monday September 25
+# 1996 Saturday September 14
+# 1997 Thursday October 2
+# 1998 Monday September 21
+# 1999 Saturday September 11
+# 2000 Saturday September 30
+# 2001 Tuesday September 18
+# 2002 Saturday September 7
+# 2003 Saturday September 27
+# 2004 Thursday September 16
+# 2005 Tuesday October 4
+# 2006 Saturday September 23
+# 2007 Thursday September 13
+# 2008 Tuesday September 30
+# 2009 Saturday September 19
+
+###############################################################################
+
+# Japan
+
+# From Guy Harris
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Japan 9:00 - JST
+
+###############################################################################
+
+# Republic of Korea
+
+# From Guy Harris:
+# According to someone at the Korean Times in San Francisco,
+# Daylight Savings Time was not observed until 1987. He did not know
+# at what time of day DST starts or ends.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule ROK 1987 max - May Sun<=14 2:00 1:00 D
+Rule ROK 1987 max - Oct Sun<=14 3:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone ROK 9:00 ROK K%sT
+
+###############################################################################
+
+# Lebanon
+
+# From Bob Devine (January 28, 1988):
+# Lebanon: They do have DST but I don't know the dates.
+
+###############################################################################
+
+# Singapore
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Singapore 8:00 - SST
diff --git a/share/zoneinfo/datfiles/australasia b/share/zoneinfo/datfiles/australasia
new file mode 100644
index 0000000..8aad7e0
--- /dev/null
+++ b/share/zoneinfo/datfiles/australasia
@@ -0,0 +1,110 @@
+# @(#)australasia 4.4
+
+# Incorporates updates for Australia from Robert Elz' australia 1.1
+# and further updates from the Australian consulate.
+
+###############################################################################
+
+# Australia
+
+# Australian Data (for states with DST), standard rules
+# Includes shift in 1987 to follow Vic/NSW rules for ending DST,
+# and shift in 1986 to start DST earlier.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Oz 1971 1985 - Oct lastSun 2:00 1:00 -
+Rule Oz 1986 max - Oct Sun<=24 2:00 1:00 -
+Rule Oz 1972 only - Feb 27 3:00 0 -
+Rule Oz 1973 1986 - Mar Sun>=1 3:00 0 -
+Rule Oz 1987 max - Mar Sun<=21 3:00 0 -
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Australia/Tasmania 10:00 Oz EST
+Zone Australia/Queensland 10:00 - EST # No DST here
+Zone Australia/North 9:30 - CST # No DST here
+Zone Australia/West 8:00 - WST # No DST here
+Zone Australia/South 9:30 Oz CST
+
+# Victoria jumped to a later ending date for DST in 1986 rather than 1987.
+
+Zone Australia/Victoria 10:00 Oz EST 1985 Oct lastSun 2:00
+ 10:00 1:00 EST 1986 Mar Sun<=21 3:00
+ 10:00 Oz EST
+
+# New South Wales and subjurisdictions have their own ideas of a fun time.
+# Based on law library research by John Mackin (john@basser.cs.su.oz),
+# who notes:
+# In Australia, time is not legislated federally, but rather by the
+# individual states. Thus, while such terms as ``Eastern Standard Time''
+# [I mean, of course, Australian EST, not any other kind] are in common
+# use, _they have NO REAL MEANING_, as they are not defined in the
+# legislation. This is very important to understand.
+# I have researched New South Wales time only; . . .I hope that perhaps a
+# resident of each state could be found to do it for their own state.
+# (And I can guarantee that Victoria and NSW are different, so the link
+# between them in the current australasia file must be broken.)
+
+# From Robert Elz (May 5, 1989):
+#
+# From next year (1990) NSW will revert to ending DST on the 1st
+# Sunday in March (rather than the third, which it appears will
+# continue to be what everyone else uses).
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NSW 1971 1985 - Oct lastSun 2:00 1:00 -
+Rule NSW 1972 only - Feb lastSun 3:00 0 -
+Rule NSW 1973 1981 - Mar Sun>=1 3:00 0 -
+Rule NSW 1982 only - Apr 4 3:00 0 -
+Rule NSW 1983 1985 - Mar Sun>=1 3:00 0 -
+Rule NSW 1986 only - Mar 16 3:00 0 -
+Rule NSW 1986 only - Oct 19 2:00 1:00 -
+Rule NSW 1987 only - Mar 15 3:00 0 -
+Rule NSW 1987 max - Oct lastSun 2:00 1:00 -
+Rule NSW 1988 1989 - Mar Sun<=21 3:00 0 -
+Rule NSW 1990 max - Mar Sun>=1 3:00 0 -
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Australia/NSW 10:00 NSW EST
+# `Broken Hill' means the County of Yancowinna. [john@basser.cs.su.oz.au,1/4/89]
+Zone Australia/Yancowinna 9:30 NSW ???
+Zone Australia/LHI 10:30 NSW ???
+
+# A footnote here:
+#
+# . . .
+# Date: Thu, j19 Feb 87 12:02:17 EST
+# From: Bradley White <seismo!k.cs.cmu.edu!bww>
+# . . .
+# I am including a description of Australian time zones. . .
+# this stuff is definitely accurate.
+# . . .
+# a) Australian Eastern Time: (EST = GMT+10:00, EDT = GMT+11:00)
+# . . .
+# Summer of 86/87 - present (current legislation):
+# third Sun Oct 02:00 EST -> third [S]un Mar 02:00 EST
+#
+# If this turns out to be true, substitute Sun<=21 (third Sunday in October)
+# for Sun<=24 (next-to-last Sunday in October) above. . .some time before
+# October 1988, the first time it makes a difference.
+
+###############################################################################
+
+# New Zealand
+
+# New Zealand, from Elz' asia 1.1
+# Elz says "no guarantees"
+#
+# the 1989/90 year was a trial of an extended "daylight saving" period.
+# This trial was deemed successful and the extended period adopted for
+# subsequent years (with the addition of a further week at the start).
+# source -- phone call to Ministry of Internal Affairs Head Office.
+# Mark Davies <mark@comp.vuw.ac.nz>, 3 Oct 1990.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule NZ 1974 1988 - Oct lastSun 2:00 1:00 D
+Rule NZ 1989 only - Oct 8 2:00 1:00 D
+Rule NZ 1990 max - Oct Sun>=1 2:00 1:00 D
+Rule NZ 1975 1989 - Mar Sun>=1 3:00 0 S
+Rule NZ 1990 max - Mar Sun>=15 3:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone NZ 12:00 NZ NZ%sT # New Zealand
diff --git a/share/zoneinfo/datfiles/etcetera b/share/zoneinfo/datfiles/etcetera
new file mode 100644
index 0000000..dbda4db
--- /dev/null
+++ b/share/zoneinfo/datfiles/etcetera
@@ -0,0 +1,55 @@
+# @(#)etcetera 4.4
+
+# All of these are set up just so people can "zic -l" to a timezone
+# that's right for their area, even if it doesn't have a name or dst rules
+# (half hour zones are too much to bother with -- when someone asks!)
+
+Zone GMT 0 - GMT
+
+Zone GMT-12 -12 - GMT-1200
+Zone GMT-11 -11 - GMT-1100
+Zone GMT-10 -10 - GMT-1000
+Zone GMT-9 -9 - GMT-0900
+Zone GMT-8 -8 - GMT-0800
+Zone GMT-7 -7 - GMT-0700
+Zone GMT-6 -6 - GMT-0600
+Zone GMT-5 -5 - GMT-0500
+Zone GMT-4 -4 - GMT-0400
+Zone GMT-3 -3 - GMT-0300
+Zone GMT-2 -2 - GMT-0200
+Zone GMT-1 -1 - GMT-0100
+Zone GMT+1 1 - GMT+0100
+Zone GMT+2 2 - GMT+0200
+Zone GMT+3 3 - GMT+0300
+Zone GMT+4 4 - GMT+0400
+Zone GMT+5 5 - GMT+0500
+Zone GMT+6 6 - GMT+0600
+Zone GMT+7 7 - GMT+0700
+Zone GMT+8 8 - GMT+0800
+Zone GMT+9 9 - GMT+0900
+Zone GMT+10 10 - GMT+1000
+Zone GMT+11 11 - GMT+1100
+Zone GMT+12 12 - GMT+1200
+Zone GMT+13 13 - GMT+1300 # GMT+12 with DST
+
+Link GMT UTC
+Link GMT UCT
+Link GMT Universal
+Link GMT Greenwich
+Link GMT Zulu
+Link GMT GMT-0
+Link GMT GMT+0
+Link GMT GMT0
+Link GMT+1 GMT1
+Link GMT+2 GMT2
+Link GMT+3 GMT3
+Link GMT+4 GMT4
+Link GMT+5 GMT5
+Link GMT+6 GMT6
+Link GMT+7 GMT7
+Link GMT+8 GMT8
+Link GMT+9 GMT9
+Link GMT+10 GMT10
+Link GMT+11 GMT11
+Link GMT+12 GMT12
+Link GMT+13 GMT13
diff --git a/share/zoneinfo/datfiles/europe b/share/zoneinfo/datfiles/europe
new file mode 100644
index 0000000..1fdffa3
--- /dev/null
+++ b/share/zoneinfo/datfiles/europe
@@ -0,0 +1,224 @@
+# @(#)europe 4.10
+
+# International country codes are used to identify countries' rules and
+# zones
+#
+# This data is by no means authoritative; if you think you know better, go
+# ahead and edit the file (and please send any changes to
+# ado@ncifcrf.gov for general use in the future).
+
+###############################################################################
+
+# United Kingdom
+
+# From Arthur David Olson (January 19, 1989):
+#
+# The starting and ending dates below (from which the rules are derived)
+# are from Whitaker's Almanack for 1987, page 146.
+# 1960 is the earliest year for which dates are given;
+# Whitaker's notes that British Summer Time (and, in some years, Double Summer
+# Time) was observed in earlier years but does not give start and end dates.
+#
+# A source at the British Information Office in New York avers that it's
+# known as "British" Summer Time in all parts of the United Kingdom.
+# 1960 April 10 October 2 (yes, 2, according to the almanac)
+# 1961 March 26 October 29
+# 1962 March 25 October 28
+# 1963 March 31 October 27
+# 1964 March 22 October 25
+# 1965 March 21 October 24
+# 1966 March 20 October 23
+# 1967 March 19 October 29
+# 1968 February 18 October 27
+# "British Standard Time, also one hour ahead of G. M. T., was kept between
+# 1968 Oct. 27-1971 Oct. 31."
+# 1972 March 19 October 29
+# 1973 March 18 October 28
+# 1974 March 17 October 27
+# 1975 March 16 October 26
+# 1976 March 21 October 24
+# 1977 March 20 October 23
+# 1978 March 19 October 29
+# 1979 March 18 October 28
+# 1980 March 16 October 26
+# 1981 March 29 October 25
+# 1982 March 28 October 24
+# 1983 March 27 October 23
+# 1984 March 25 October 28
+# 1985 March 31 October 27
+# 1986 March 30 October 26
+# 1987 March 29 October 25
+
+# From an Anonymous U. K. Donor (January 4, 1989):
+#
+# It is NOT possible to predict when [British Summer Time] will change
+# in a future year.
+#
+# (The admiralty calculate when they think it should be (no more that a couple
+# of years in advance) and advise the government who then decide whether or
+# not they will take the admiralty's advice)
+#
+# ...the Gre[e]nwich...observatory...[was] very helpful.
+#
+# I was not able to track down the Admiralty formula (I tried hard but failed)
+
+# ...
+# Date: 4 Jan 89 08:57:25 GMT (Wed)
+# From: Jonathan Leffler <nih-csl!uunet!mcvax!sphinx.co.uk!john>
+# ...
+# [British Summer Time] is fixed annually by Act of Parliament.
+# If you can predict what Parliament will do, you should be in
+# politics making a fortune, not computing.
+#
+# Summer time ends on Sunday 29 October 1989.
+
+# ...
+# Date: 5 Jan 89 09:50:38 GMT (Thu)
+# From: Peter Kendell <nih-csl!uunet!mcvax!tcom.stc.co.uk!pete>
+# ...
+#
+# From my Collins Diary for 1989 -
+#
+# "At the time of going to press the Home Office was unable to confirm
+# the 1989 starting and finishing dates for BST*, but expressed the
+# view that 26 March and 29 October were the likeliest dates to be
+# adopted"
+#
+# *British Summer Time.
+
+# From an Anonymous U. K. Donor (January 5, 1989):
+#
+# . . .our government is seriously considering applying Double Summer Time -
+# putting the clocks forwards and back TWO hours for daylight saving time.
+# This is advocated to standardise time in the EEC - we're all supposed to
+# keep the same time and to change the clocks on the same dates in the future.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+# Historic starting rules
+Rule GB-Eire 1960 only - Apr 10 1:00s 1:00 BST
+Rule GB-Eire 1961 1963 - Mar lastSun 1:00s 1:00 BST
+Rule GB-Eire 1964 1967 - Mar Sun>=19 1:00s 1:00 BST
+Rule GB-Eire 1968 only - Feb 18 1:00s 1:00 BST
+Rule GB-Eire 1972 1980 - Mar Sun>=16 1:00s 1:00 BST
+# Historic ending rules
+Rule GB-Eire 1960 only - Oct 2 1:00s 0 GMT
+Rule GB-Eire 1961 1967 - Oct Sun>=23 1:00s 0 GMT
+Rule GB-Eire 1971 only - Oct 31 1:00s 0 GMT
+# Current rules
+Rule GB-Eire 1981 max - Mar lastSun 1:00s 1:00 BST
+Rule GB-Eire 1972 max - Oct Sun>=23 1:00s 0 GMT
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone GB-Eire 0:00 GB-Eire %s 1968 Oct 27 1:00s
+ 1:00 - BST 1971 Oct 31 1:00s
+ 0:00 GB-Eire %s
+
+###############################################################################
+
+# Continental Europe
+
+# The use of 1986 as starting years below is conservative.
+
+Rule W-Eur 1986 max - Mar lastSun 1:00s 1:00 " DST"
+Rule W-Eur 1986 max - Sep lastSun 1:00s 0 -
+
+Rule M-Eur 1986 max - Mar lastSun 2:00s 1:00 " DST"
+Rule M-Eur 1986 max - Sep lastSun 2:00s 0 -
+
+Rule E-Eur 1986 max - Mar lastSun 3:00s 1:00 " DST"
+Rule E-Eur 1986 max - Sep lastSun 3:00s 0 -
+
+Rule Turkey 1986 max - Mar lastSun 1:00 1:00 " DST"
+Rule Turkey 1986 max - Sep lastSun 1:00 0 -
+
+Rule W-SU 1986 max - Mar lastSun 2:00s 1:00 " DST"
+Rule W-SU 1986 max - Sep lastSun 2:00s 0 -
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone WET 0:00 W-Eur WET%s
+Zone Iceland 0:00 - WET
+Zone MET 1:00 M-Eur MET%s
+Zone Poland 1:00 W-Eur MET%s
+Zone EET 2:00 E-Eur EET%s
+Zone Turkey 3:00 Turkey EET%s
+Zone W-SU 3:00 M-Eur ????
+
+# Tom Hoffman says that MET is also known as Central European Time
+
+Link MET CET
+
+###############################################################################
+
+# One source shows that Bulgaria, Cyprus, Finland, and Greece observe DST from
+# the last Sunday in March to the last Sunday in September in 1986.
+# The source shows Romania changing a day later than everybody else.
+#
+# According to Bernard Sieloff's source, Poland is in the MET time zone but
+# uses the WE DST rules. The Western USSR uses EET+1 and ME DST rules.
+# Bernard Sieloff's source claims Romania switches on the same day, but at
+# 00:00 standard time (i.e., 01:00 DST). It also claims that Turkey
+# switches on the same day, but switches on at 01:00 standard time
+# and off at 00:00 standard time (i.e., 01:00 DST)
+
+# ...
+# Date: Wed, 28 Jan 87 16:56:27 -0100
+# From: seismo!mcvax!cgcha!wtho (Tom Hofmann)
+# Message-Id: <8701281556.AA22174@cgcha.uucp>
+# ...
+#
+# ...the European time rules are...standardized since 1981, when
+# most European coun[tr]ies started DST. Before that year, only
+# a few countries (UK, France, Italy) had DST, each according
+# to own national rules. In 1981, however, DST started on
+# 'Apr firstSun', and not on 'Mar lastSun' as in the following
+# years...
+# But also since 1981 there are some more national exceptions
+# than listed in 'europe': Switzerland, for example, joined DST
+# one year later, Denmark ended DST on 'Oct 1' instead of 'Sep
+# lastSun' in 1981---I don't know how they handle now.
+#
+# Finally, DST ist always from 'Apr 1' to 'Oct 1' in the
+# Soviet Union (as far as I know).
+#
+# Tom Hofmann, Scientific Computer Center, CIBA-GEIGY AG,
+# 4002 Basle, Switzerland
+# UUCP: ...!mcvax!cernvax!cgcha!wtho
+
+# ...
+# Date: Wed, 4 Feb 87 22:35:22 +0100
+# From: seismo!mcvax!cwi.nl!dik (Dik T. Winter)
+# ...
+#
+# The information from Tom Hofmann is (as far as I know) not entirely correct.
+# After a request from chongo at amdahl I tried to retrieve all information
+# about DST in Europe. I was able to find all from about 1969.
+#
+# ...standardization on DST in Europe started in about 1977 with switches on
+# first Sunday in April and last Sunday in September...
+# In 1981 UK joined Europe insofar that
+# the starting day for both shifted to last Sunday in March. And from 1982
+# the whole of Europe used DST, with switch dates April 1 and October 1 in
+# the Sov[i]et Union. In 1985 the SU reverted to standard Europe[a]n switch
+# dates...
+#
+# It should also be remembered that time-zones are not constants; e.g.
+# Portugal switched in 1976 from MET (or CET) to WET with DST...
+# Note also that though there were rules for switch dates not
+# all countries abided to these dates, and many individual deviations
+# occurred, though not since 1982 I believe. Another note: it is always
+# assumed that DST is 1 hour ahead of normal time, this need not be the
+# case; at least in the Netherlands there have been times when DST was 2 hours
+# in advance of normal time.
+#
+# ...
+# dik t. winter, cwi, amsterdam, nederland
+# INTERNET : dik@cwi.nl
+# BITNET/EARN: dik@mcvax
+
+# From Bob Devine (January 28, 1988):
+# ...
+# Greece: Last Sunday in April to last Sunday in September (iffy on dates).
+# Since 1978. Change at midnight.
+# ...
+# Monaco: has same DST as France.
+# ...
diff --git a/share/zoneinfo/datfiles/factory b/share/zoneinfo/datfiles/factory
new file mode 100644
index 0000000..c1c38c1
--- /dev/null
+++ b/share/zoneinfo/datfiles/factory
@@ -0,0 +1,8 @@
+# @(#)factory 1.1
+
+# For companies who don't want to put time zone specification in
+# their installation procedures. When users run date, they'll get the message.
+# Also useful for the "comp.sources" version.
+
+# Zone NAME GMTOFF RULES FORMAT
+Zone Factory 0 - "Local time zone must be set--see zic manual page"
diff --git a/share/zoneinfo/datfiles/leapseconds b/share/zoneinfo/datfiles/leapseconds
new file mode 100644
index 0000000..cc7c6b4
--- /dev/null
+++ b/share/zoneinfo/datfiles/leapseconds
@@ -0,0 +1,31 @@
+# @(#)leapseconds 8.1 (Berkeley) 6/29/93
+
+# Allowance for leapseconds added to each timezone file.
+
+# The correction (+ or -) is made at the given time, so lines
+# will typically look like:
+# Leap YEAR MON DAY 23:59:60 + R/S
+# or
+# Leap YEAR MON DAY 23:59:59 - R/S
+
+# If the leapsecond is Rolling (R) the given time is local time
+# If the leapsecond is Stationary (S) the given time is GMT
+
+# Leap YEAR MONTH DAY HH:MM:SS CORR R/S
+Leap 1972 Jun 30 23:59:60 + S
+Leap 1972 Dec 31 23:59:60 + S
+Leap 1973 Dec 31 23:59:60 + S
+Leap 1974 Dec 31 23:59:60 + S
+Leap 1975 Dec 31 23:59:60 + S
+Leap 1976 Dec 31 23:59:60 + S
+Leap 1977 Dec 31 23:59:60 + S
+Leap 1978 Dec 31 23:59:60 + S
+Leap 1979 Dec 31 23:59:60 + S
+Leap 1981 Jun 30 23:59:60 + S
+Leap 1982 Jun 30 23:59:60 + S
+Leap 1983 Jun 30 23:59:60 + S
+Leap 1985 Jun 30 23:59:60 + S
+Leap 1987 Dec 31 23:59:60 + S
+Leap 1989 Dec 31 23:59:60 + S
+Leap 1990 Dec 31 23:59:60 + S
+Leap 1993 Jun 30 23:59:60 + S
diff --git a/share/zoneinfo/datfiles/northamerica b/share/zoneinfo/datfiles/northamerica
new file mode 100644
index 0000000..53a1df1
--- /dev/null
+++ b/share/zoneinfo/datfiles/northamerica
@@ -0,0 +1,321 @@
+# @(#)northamerica 4.8
+
+###############################################################################
+
+# United States
+
+# From Arthur David Olson:
+# US Daylight Saving Time ended on the last Sunday of *October* in 1974.
+# See, for example, the front page of the Saturday, October 26, 1974
+# and Sunday, October 27, 1974 editions of the Washington Post.
+
+# From seismo!munnari!kre:
+# I recall also being told by someone once that Canada didn't have
+# the DST variations in 74/75 that the US did, but I am not nearly
+# sure enough of this to add anything.
+
+# From Arthur David Olson:
+# The above has been confirmed by Bob Devine; we'll go with it here.
+
+# From Arthur David Olson:
+# Before the Uniform Time Act of 1966 took effect in 1967, observance of
+# Daylight Saving Time in the US was by local option, except during wartime.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule US 1918 1919 - Mar lastSun 2:00 1:00 D
+Rule US 1918 1919 - Oct lastSun 2:00 0 S
+Rule US 1942 only - Feb 9 2:00 1:00 W # War
+Rule US 1945 only - Sep 30 2:00 0 S
+Rule US 1967 max - Oct lastSun 2:00 0 S
+Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
+Rule US 1974 only - Jan 6 2:00 1:00 D
+Rule US 1975 only - Feb 23 2:00 1:00 D
+Rule US 1976 1986 - Apr lastSun 2:00 1:00 D
+Rule US 1987 max - Apr Sun>=1 2:00 1:00 D
+
+# From Bob Devine (January 28, 1988):
+# ...Alaska (and Hawaii) had the timezone names changed in 1967.
+# old new
+# Pacific Standard Time(PST) -same-
+# Yukon Standard Time(YST) -same-
+# Central Alaska S.T. (CAT) Alaska-Hawaii St[an]dard Time (AHST)
+# Nome Standard Time (NT) Bering Standard Time (BST)
+#
+# ...Alaska's timezone lines were redrawn in 1983 to give only 2 tz.
+# The YST zone now covers nearly all of the state, AHST just part
+# of the Aleutian islands. No DST.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
+# USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
+# USA CENTRAL 6 H BEHIND UTC CHICAGO, HOUSTON
+# USA CENTRAL 5 H BEHIND UTC APR 3 - OCT 30
+# USA MOUNTAIN 7 H BEHIND UTC DENVER
+# USA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 30
+# USA PACIFIC 8 H BEHIND UTC L.A., SAN FRANCISCO
+# USA PACIFIC 7 H BEHIND UTC APR 3 - OCT 30
+# USA ALASKA STD 9 H BEHIND UTC MOST OF ALASKA (AKST)
+# USA ALASKA STD 8 H BEHIND UTC APR 3 - OCT 30 (AKDT)
+# USA ALEUTIAN 10 H BEHIND UTC ISLANDS WEST OF 170W
+# USA - " - 9 H BEHIND UTC APR 3 - OCT 30
+# USA HAWAII 10 H BEHIND UTC
+# USA BERING 11 H BEHIND UTC SAMOA, MIDWAY
+
+# From Arthur David Olson (January 21, 1989):
+# The above dates are for 1988.
+# Note the "AKST" and "AKDT" abbreviations, the claim that there's
+# no DST in Samoa, and the claim that there is DST in Alaska and the
+# Aleutians.
+
+# From Arthur David Olson (February 13, 1988):
+# Legal standard time zone names, from United States Code (1982 Edition and
+# Supplement III), Title 15, Chapter 6, Section 260 and forward. First, names
+# up to April 1, 1967 (when most provisions of the Uniform Time Act of 1966
+# took effect), as explained in sections 263 and 261:
+# (none)
+# United States standard eastern time
+# United States standard mountain time
+# United States standard central time
+# United States standard Pacific time
+# (none)
+# United States standard Alaska time
+# (none)
+# Next, names from April 1, 1967 until November 30, 1983 (the date for
+# public law 98-181):
+# Atlantic standard time
+# eastern standard time
+# central standard time
+# mountain standard time
+# Pacific standard time
+# Yukon standard time
+# Alaska-Hawaii standard time
+# Bering standard time
+# And after November 30, 1983:
+# Atlantic standard time
+# eastern standard time
+# central standard time
+# mountain standard time
+# Pacific standard time
+# Alaska standard time
+# Hawaii-Aleutian standard time
+# Samoa standard time
+# The law doesn't give abbreviations.
+
+# Easy stuff first--including Alaska, where we ignore history (since we
+# can't tell if we should give Yukon time or Alaska-Hawaii time for "old"
+# times).
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone US/Eastern -5:00 US E%sT
+Zone US/Central -6:00 US C%sT
+Zone US/Mountain -7:00 US M%sT
+Zone US/Pacific -8:00 US P%sT
+Zone US/Alaska -9:00 US AK%sT # Abbreviation per USNO
+
+# Mainland US areas that are always Standard as of 1986.
+
+Zone US/East-Indiana -5:00 US E%sT 1946
+ -5:00 - EST # Always EST as of 1986
+Zone US/Arizona -7:00 US M%sT 1946
+ -7:00 - MST # Always MST as of 1986
+
+# From Arthur David Olson (February 13, 1988):
+# However. . .a writer from the Inter Tribal Council of Arizona, Inc.,
+# notes in private correspondence dated 12/28/87 that "Presently, only the
+# Navajo Nation participates in the Daylight Saving Time policy, due to its
+# large size and location in three states." (The "only" means that other
+# tribal nations don't use DST.)
+
+Link US/Mountain Navajo
+
+# From Bob Devine (January 28, 1988):
+# Michigan didn't observe DST from 1968 to 1973.
+
+Zone US/Michigan -5:00 US E%sT 1968
+ -5:00 - EST 1973
+ -5:00 US E%sT
+
+# Samoa just changes names. No DST, per Naval Observatory.
+
+Zone US/Samoa -11:00 - NST 1967 Apr 1 # N=Nome
+ -11:00 - BST 1983 Nov 30 # B=Bering
+ -11:00 - SST # S=Samoa
+
+# Aleutian has a name change. DST, per Naval Observatory.
+
+Zone US/Aleutian -10:00 US AH%sT 1983 Nov 30
+ -10:00 US HA%sT
+
+# From Arthur David Olson:
+# And then there's Hawaii.
+# DST was observed for one day in 1933;
+# Standard time was change by half an hour in 1947;
+# it's always standard as of 1986.
+
+Zone US/Hawaii -10:30 US H%sT 1933 Apr 30 2:00
+ -10:30 1:00 HDT 1933 May 1 2:00
+ -10:30 US H%sT 1947 Jun 8 2:00
+ -10:00 - HST
+
+# Old names, for S5 users
+
+# Link LINK-FROM LINK-TO
+# Link US/Eastern EST5EDT
+# Link US/Central CST6CDT
+# Link US/Mountain MST7MDT
+# Link US/Pacific PST8PDT
+# Link US/East-Indiana EST
+# Link US/Arizona MST
+# Link US/Hawaii HST
+
+################################################################################
+
+# Canada
+
+# Canada is reportedly lots easier than the US--leastways since 1951.
+# I don't know what they did before then.
+# 4.3BSD claims that it's perfectly regular.
+# According to a posting in "comp.bugs.misc", "comp.unix.wizards", etc.
+# on February 8, 1987, by Dave Sherman of the Law Society of Upper Canada,
+# "...Canada (well, Ontario and at least some of the other provinces) are
+# adopting the new daylight savings time rules...". We assume all of
+# Canada is doing so.
+
+# From Bob Devine (January 28, 1988):
+# All of Canada did have DST from your first rule except Saskatchewan.
+# Which parts did not observe DST is hard to pinpoint but most of the
+# province follows the rules.
+# NOTE: those that didn't have DST for that rule, also
+# probably did not have it for several years previous.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# CANADA NEW FDL 3.5H BEHIND UTC ST.JOHN'S
+# CANADA NEW FDL 1.5H BEHIND UTC APR 3 - OCT 29
+# CANADA ATLANTIC 4 H BEHIND UTC HALIFAX
+# CANADA ATLANTIC 3 H BEHIND UTC APR 3 - OCT 29
+# CANADA EASTERN 5 H BEHIND UTC TORONTO, MONTREAL, OTTAWA
+# CANADA EASTERN 4 H BEHIND UTC APR 3 - OCT 29
+# CANADA CENTRAL 6 H BEHIND UTC REGINA, WINNIPEG
+# CANADA CENTRAL 5 H BEHIND UTC APR 3 - OCT 29
+# CANADA MOUNTAIN 7 H BEHIND UTC CALGARY, EDMONTON
+# CANADA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 29
+# CANADA PACIFIC 8 H BEHIND UTC VANCOUVER
+# CANADA PACIFIC 7 H BEHIND UTC APR 3 - OCT 29
+# CANADA YUKON SAME AS PACIFIC DAWSON
+
+# From Arthur David Olson (January 21, 1989):
+# April 3 fell on a Sunday in 1988; October 29 fell on a Sunday in 1989. Ahem.
+# Note claim that there's double DST in Newfoundland and that Yukon should
+# be same as Pacific. Stick with rules posted in 1988 until more authoritative
+# information is available.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Canada 1969 max - Oct lastSun 2:00 0 S
+Rule Canada 1969 1986 - Apr lastSun 2:00 1:00 D
+Rule Canada 1987 max - Apr Sun>=1 2:00 1:00 D
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+# Bob Devine says that DST *is* observed in Newfoundland
+Zone Canada/Newfoundland -3:30 Canada N%sT
+Zone Canada/Atlantic -4:00 Canada A%sT
+Zone Canada/Eastern -5:00 Canada E%sT
+Zone Canada/Central -6:00 Canada C%sT
+Zone Canada/East-Saskatchewan -6:00 - CST # No DST as of 1987
+Zone Canada/Mountain -7:00 Canada M%sT
+Zone Canada/Pacific -8:00 Canada P%sT
+Zone Canada/Yukon -9:00 Canada Y%sT
+
+###############################################################################
+
+# Mexico
+
+# From Guy Harris:
+# Rules are from the Official Airline Guide, Worldwide Edition, for 1987.
+# Rules prior to 1987 are unknown.
+# The comments in the OAG say "Only Ensenada, Mexicale, San Felipe and Tijuana
+# observe DST." This is presumably Baja California Norte, above 28th parallel,
+# as listed there; Mexico/BajaSur is for "Baja California Sur and N. Pacific
+# Coast (States of Sinaloa and Sonora)."
+
+# From Bob Devine (January 28, 1988):
+# The Federal District (where Mexico City is) has observed [DST] several
+# times but not recently.
+#
+# I don't where to drawn the line in the North Baja area. 28th latitude
+# sounds good -- but it may be higher (how far [d]o radio stations from
+# San Diego affect culture?).
+#
+# The dates of DST probably go back to 1981. The rules are the same as
+# US's. This is going to be a headache for US presidential electi[o]n years!
+
+# From Arthur David Olson (February 13, 1988)
+# Since the 1981 starting date is only "probable," we'll keep the 1987
+# starting date below.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# MEXICO BAJA CAL N 7 H BEHIND UTC BAJA CALIFORNIA SUR AND
+# MEXICO BAJA CAL N N. PACIFIC COAST (STATES
+# MEXICO BAJA CAL N OF SINALOA AND SONORA)
+# MEXICO BAJA CAL N 8 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
+# MEXICO BAJA CAL N - OCT 29
+# MEXICO BAJA CAL N 7 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
+# MEXICO BAJA CAL N - 0CT 29
+# MEXICO 6 H BEHIND UTC STATES OF DURANGO,
+# MEXICO COAHUILA, NUEVO LEON,
+# MEXICO TAMAULIPAS
+# MEXICO 5 H BEHIND UTC STATES OF DURANGO,
+# MEXICO COAHUILA, NUEVO LEON,
+# MEXICO TAMAULIPAS APR 3 - OCT 29
+# MEXICO 6 H BEHIND UTC GENERAL MEXICO, STATES OF
+# MEXICO CAMPECHE, QUINTANA ROO AND
+# MEXICO YUCATAN
+
+# From Arthur David Olson (January 21, 1989):
+# April 3 fell on a Sunday in 1988; October 29 fell on a Sunday in 1989. Ahem.
+# USNO claims there should be four Mexican zones rather than three:
+# a zone that's GMT-8 with DST; a zone that's always GMT-7;
+# a zone that's GMT-6 with DST; and a zone that's always GMT-6.
+# Wait for more authoritative information before changing.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Mexico 1987 max - Oct lastSun 2:00 0 S
+Rule Mexico 1987 max - Apr Sun>=1 2:00 1:00 D
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Mexico/BajaNorte -8:00 Mexico P%sT
+Zone Mexico/BajaSur -7:00 - MST
+Zone Mexico/General -6:00 - CST
+
+###############################################################################
+
+# Jamaica
+
+# From Bob Devine (January 28, 1988):
+# Follows US rules.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# JAMAICA 5 H BEHIND UTC
+
+Link US/Eastern Jamaica
+
+###############################################################################
+
+# Cuba
+
+# From Bob Devine (January 28, 1988):
+# . . .DST is from 2nd Sunday in May to 2nd Sunday in October since 1981.
+# Change at midnight. In 1979 & 1980, started at 3rd Sunday in March
+# (I think).
+
+# From U. S. Naval Observatory (January 19, 1989):
+# CUBA 5 H BEHIND UTC
+# CUBA 4 H BEHIND UTC MAR 20 - OCT 8
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Cuba 1979 1980 - Mar Sun>=15 0:00 1:00 D
+Rule Cuba 1979 1980 - Oct Sun>=8 0:00 0 S
+Rule Cuba 1981 max - May Sun>=8 0:00 1:00 D
+Rule Cuba 1981 max - Oct Sun>=8 0:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT
+Zone Cuba -5:00 Cuba C%sT
diff --git a/share/zoneinfo/datfiles/pacificnew b/share/zoneinfo/datfiles/pacificnew
new file mode 100644
index 0000000..8e6850c
--- /dev/null
+++ b/share/zoneinfo/datfiles/pacificnew
@@ -0,0 +1,21 @@
+# @(#)pacificnew 4.4
+
+# From Arthur David Olson (January 18, 1989):
+# On November 10, 1987, the U. S. House of Representatives passed a bill
+# (H.R. 435), the "Uniform Poll Closing Time Act", establishing
+# "Pacific Presidential Election Time"; it was not acted on by the Senate
+# before the end of the 100th Congress and so died.
+# The bill has been reintroduced in the 101st Congress as H. R. 18;
+# H. R. 96 also deals with poll closing time. Either bill would have to be
+# passed by both the House and Senate and signed by the President (or have
+# the President's veto overridden by the House and Senate) before becoming law.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Twilite 1989 max - Apr Sun>=1 2:00 1:00 D
+Rule Twilite 1989 max uspres Oct lastSun 2:00 1:00 PE
+Rule Twilite 1989 max uspres Nov Sun>=7 2:00 0 S
+Rule Twilite 1989 max nonpres Oct lastSun 2:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone US/Pacific-New -8:00 US P%sT 1989
+ -8:00 Twilite P%sT
diff --git a/share/zoneinfo/datfiles/solar87 b/share/zoneinfo/datfiles/solar87
new file mode 100644
index 0000000..5067457
--- /dev/null
+++ b/share/zoneinfo/datfiles/solar87
@@ -0,0 +1,386 @@
+# @(#)solar87 4.1
+
+# So much for footnotes about Saudi Arabia.
+# Apparent noon times below are for Riyadh; your mileage will vary.
+# Times were computed using formulas in the U.S. Naval Observatory's
+# Almanac for Computers 1987; the formulas "will give EqT to an accuracy of
+# [plus or minus two] seconds during the current year."
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule sol87 1987 only - Jan 1 12:03:20s -0:03:20 -
+Rule sol87 1987 only - Jan 2 12:03:50s -0:03:50 -
+Rule sol87 1987 only - Jan 3 12:04:15s -0:04:15 -
+Rule sol87 1987 only - Jan 4 12:04:45s -0:04:45 -
+Rule sol87 1987 only - Jan 5 12:05:10s -0:05:10 -
+Rule sol87 1987 only - Jan 6 12:05:40s -0:05:40 -
+Rule sol87 1987 only - Jan 7 12:06:05s -0:06:05 -
+Rule sol87 1987 only - Jan 8 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jan 9 12:06:55s -0:06:55 -
+Rule sol87 1987 only - Jan 10 12:07:20s -0:07:20 -
+Rule sol87 1987 only - Jan 11 12:07:45s -0:07:45 -
+Rule sol87 1987 only - Jan 12 12:08:10s -0:08:10 -
+Rule sol87 1987 only - Jan 13 12:08:30s -0:08:30 -
+Rule sol87 1987 only - Jan 14 12:08:55s -0:08:55 -
+Rule sol87 1987 only - Jan 15 12:09:15s -0:09:15 -
+Rule sol87 1987 only - Jan 16 12:09:35s -0:09:35 -
+Rule sol87 1987 only - Jan 17 12:09:55s -0:09:55 -
+Rule sol87 1987 only - Jan 18 12:10:15s -0:10:15 -
+Rule sol87 1987 only - Jan 19 12:10:35s -0:10:35 -
+Rule sol87 1987 only - Jan 20 12:10:55s -0:10:55 -
+Rule sol87 1987 only - Jan 21 12:11:10s -0:11:10 -
+Rule sol87 1987 only - Jan 22 12:11:30s -0:11:30 -
+Rule sol87 1987 only - Jan 23 12:11:45s -0:11:45 -
+Rule sol87 1987 only - Jan 24 12:12:00s -0:12:00 -
+Rule sol87 1987 only - Jan 25 12:12:15s -0:12:15 -
+Rule sol87 1987 only - Jan 26 12:12:30s -0:12:30 -
+Rule sol87 1987 only - Jan 27 12:12:40s -0:12:40 -
+Rule sol87 1987 only - Jan 28 12:12:55s -0:12:55 -
+Rule sol87 1987 only - Jan 29 12:13:05s -0:13:05 -
+Rule sol87 1987 only - Jan 30 12:13:15s -0:13:15 -
+Rule sol87 1987 only - Jan 31 12:13:25s -0:13:25 -
+Rule sol87 1987 only - Feb 1 12:13:35s -0:13:35 -
+Rule sol87 1987 only - Feb 2 12:13:40s -0:13:40 -
+Rule sol87 1987 only - Feb 3 12:13:50s -0:13:50 -
+Rule sol87 1987 only - Feb 4 12:13:55s -0:13:55 -
+Rule sol87 1987 only - Feb 5 12:14:00s -0:14:00 -
+Rule sol87 1987 only - Feb 6 12:14:05s -0:14:05 -
+Rule sol87 1987 only - Feb 7 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 8 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 9 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 10 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 11 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 12 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 13 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 14 12:14:15s -0:14:15 -
+Rule sol87 1987 only - Feb 15 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 16 12:14:10s -0:14:10 -
+Rule sol87 1987 only - Feb 17 12:14:05s -0:14:05 -
+Rule sol87 1987 only - Feb 18 12:14:00s -0:14:00 -
+Rule sol87 1987 only - Feb 19 12:13:55s -0:13:55 -
+Rule sol87 1987 only - Feb 20 12:13:50s -0:13:50 -
+Rule sol87 1987 only - Feb 21 12:13:45s -0:13:45 -
+Rule sol87 1987 only - Feb 22 12:13:35s -0:13:35 -
+Rule sol87 1987 only - Feb 23 12:13:30s -0:13:30 -
+Rule sol87 1987 only - Feb 24 12:13:20s -0:13:20 -
+Rule sol87 1987 only - Feb 25 12:13:10s -0:13:10 -
+Rule sol87 1987 only - Feb 26 12:13:00s -0:13:00 -
+Rule sol87 1987 only - Feb 27 12:12:50s -0:12:50 -
+Rule sol87 1987 only - Feb 28 12:12:40s -0:12:40 -
+Rule sol87 1987 only - Mar 1 12:12:30s -0:12:30 -
+Rule sol87 1987 only - Mar 2 12:12:20s -0:12:20 -
+Rule sol87 1987 only - Mar 3 12:12:05s -0:12:05 -
+Rule sol87 1987 only - Mar 4 12:11:55s -0:11:55 -
+Rule sol87 1987 only - Mar 5 12:11:40s -0:11:40 -
+Rule sol87 1987 only - Mar 6 12:11:25s -0:11:25 -
+Rule sol87 1987 only - Mar 7 12:11:15s -0:11:15 -
+Rule sol87 1987 only - Mar 8 12:11:00s -0:11:00 -
+Rule sol87 1987 only - Mar 9 12:10:45s -0:10:45 -
+Rule sol87 1987 only - Mar 10 12:10:30s -0:10:30 -
+Rule sol87 1987 only - Mar 11 12:10:15s -0:10:15 -
+Rule sol87 1987 only - Mar 12 12:09:55s -0:09:55 -
+Rule sol87 1987 only - Mar 13 12:09:40s -0:09:40 -
+Rule sol87 1987 only - Mar 14 12:09:25s -0:09:25 -
+Rule sol87 1987 only - Mar 15 12:09:10s -0:09:10 -
+Rule sol87 1987 only - Mar 16 12:08:50s -0:08:50 -
+Rule sol87 1987 only - Mar 17 12:08:35s -0:08:35 -
+Rule sol87 1987 only - Mar 18 12:08:15s -0:08:15 -
+Rule sol87 1987 only - Mar 19 12:08:00s -0:08:00 -
+Rule sol87 1987 only - Mar 20 12:07:40s -0:07:40 -
+Rule sol87 1987 only - Mar 21 12:07:25s -0:07:25 -
+Rule sol87 1987 only - Mar 22 12:07:05s -0:07:05 -
+Rule sol87 1987 only - Mar 23 12:06:50s -0:06:50 -
+Rule sol87 1987 only - Mar 24 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Mar 25 12:06:10s -0:06:10 -
+Rule sol87 1987 only - Mar 26 12:05:55s -0:05:55 -
+Rule sol87 1987 only - Mar 27 12:05:35s -0:05:35 -
+Rule sol87 1987 only - Mar 28 12:05:15s -0:05:15 -
+Rule sol87 1987 only - Mar 29 12:05:00s -0:05:00 -
+Rule sol87 1987 only - Mar 30 12:04:40s -0:04:40 -
+Rule sol87 1987 only - Mar 31 12:04:25s -0:04:25 -
+Rule sol87 1987 only - Apr 1 12:04:05s -0:04:05 -
+Rule sol87 1987 only - Apr 2 12:03:45s -0:03:45 -
+Rule sol87 1987 only - Apr 3 12:03:30s -0:03:30 -
+Rule sol87 1987 only - Apr 4 12:03:10s -0:03:10 -
+Rule sol87 1987 only - Apr 5 12:02:55s -0:02:55 -
+Rule sol87 1987 only - Apr 6 12:02:35s -0:02:35 -
+Rule sol87 1987 only - Apr 7 12:02:20s -0:02:20 -
+Rule sol87 1987 only - Apr 8 12:02:05s -0:02:05 -
+Rule sol87 1987 only - Apr 9 12:01:45s -0:01:45 -
+Rule sol87 1987 only - Apr 10 12:01:30s -0:01:30 -
+Rule sol87 1987 only - Apr 11 12:01:15s -0:01:15 -
+Rule sol87 1987 only - Apr 12 12:00:55s -0:00:55 -
+Rule sol87 1987 only - Apr 13 12:00:40s -0:00:40 -
+Rule sol87 1987 only - Apr 14 12:00:25s -0:00:25 -
+Rule sol87 1987 only - Apr 15 12:00:10s -0:00:10 -
+Rule sol87 1987 only - Apr 16 11:59:55s 0:00:05 -
+Rule sol87 1987 only - Apr 17 11:59:45s 0:00:15 -
+Rule sol87 1987 only - Apr 18 11:59:30s 0:00:30 -
+Rule sol87 1987 only - Apr 19 11:59:15s 0:00:45 -
+Rule sol87 1987 only - Apr 20 11:59:05s 0:00:55 -
+Rule sol87 1987 only - Apr 21 11:58:50s 0:01:10 -
+Rule sol87 1987 only - Apr 22 11:58:40s 0:01:20 -
+Rule sol87 1987 only - Apr 23 11:58:25s 0:01:35 -
+Rule sol87 1987 only - Apr 24 11:58:15s 0:01:45 -
+Rule sol87 1987 only - Apr 25 11:58:05s 0:01:55 -
+Rule sol87 1987 only - Apr 26 11:57:55s 0:02:05 -
+Rule sol87 1987 only - Apr 27 11:57:45s 0:02:15 -
+Rule sol87 1987 only - Apr 28 11:57:35s 0:02:25 -
+Rule sol87 1987 only - Apr 29 11:57:25s 0:02:35 -
+Rule sol87 1987 only - Apr 30 11:57:15s 0:02:45 -
+Rule sol87 1987 only - May 1 11:57:10s 0:02:50 -
+Rule sol87 1987 only - May 2 11:57:00s 0:03:00 -
+Rule sol87 1987 only - May 3 11:56:55s 0:03:05 -
+Rule sol87 1987 only - May 4 11:56:50s 0:03:10 -
+Rule sol87 1987 only - May 5 11:56:45s 0:03:15 -
+Rule sol87 1987 only - May 6 11:56:40s 0:03:20 -
+Rule sol87 1987 only - May 7 11:56:35s 0:03:25 -
+Rule sol87 1987 only - May 8 11:56:30s 0:03:30 -
+Rule sol87 1987 only - May 9 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 10 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 11 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 12 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 13 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 14 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 15 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 16 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 17 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 18 11:56:20s 0:03:40 -
+Rule sol87 1987 only - May 19 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 20 11:56:25s 0:03:35 -
+Rule sol87 1987 only - May 21 11:56:30s 0:03:30 -
+Rule sol87 1987 only - May 22 11:56:35s 0:03:25 -
+Rule sol87 1987 only - May 23 11:56:40s 0:03:20 -
+Rule sol87 1987 only - May 24 11:56:45s 0:03:15 -
+Rule sol87 1987 only - May 25 11:56:50s 0:03:10 -
+Rule sol87 1987 only - May 26 11:56:55s 0:03:05 -
+Rule sol87 1987 only - May 27 11:57:00s 0:03:00 -
+Rule sol87 1987 only - May 28 11:57:10s 0:02:50 -
+Rule sol87 1987 only - May 29 11:57:15s 0:02:45 -
+Rule sol87 1987 only - May 30 11:57:25s 0:02:35 -
+Rule sol87 1987 only - May 31 11:57:30s 0:02:30 -
+Rule sol87 1987 only - Jun 1 11:57:40s 0:02:20 -
+Rule sol87 1987 only - Jun 2 11:57:50s 0:02:10 -
+Rule sol87 1987 only - Jun 3 11:58:00s 0:02:00 -
+Rule sol87 1987 only - Jun 4 11:58:10s 0:01:50 -
+Rule sol87 1987 only - Jun 5 11:58:20s 0:01:40 -
+Rule sol87 1987 only - Jun 6 11:58:30s 0:01:30 -
+Rule sol87 1987 only - Jun 7 11:58:40s 0:01:20 -
+Rule sol87 1987 only - Jun 8 11:58:50s 0:01:10 -
+Rule sol87 1987 only - Jun 9 11:59:05s 0:00:55 -
+Rule sol87 1987 only - Jun 10 11:59:15s 0:00:45 -
+Rule sol87 1987 only - Jun 11 11:59:30s 0:00:30 -
+Rule sol87 1987 only - Jun 12 11:59:40s 0:00:20 -
+Rule sol87 1987 only - Jun 13 11:59:50s 0:00:10 -
+Rule sol87 1987 only - Jun 14 12:00:05s -0:00:05 -
+Rule sol87 1987 only - Jun 15 12:00:15s -0:00:15 -
+Rule sol87 1987 only - Jun 16 12:00:30s -0:00:30 -
+Rule sol87 1987 only - Jun 17 12:00:45s -0:00:45 -
+Rule sol87 1987 only - Jun 18 12:00:55s -0:00:55 -
+Rule sol87 1987 only - Jun 19 12:01:10s -0:01:10 -
+Rule sol87 1987 only - Jun 20 12:01:20s -0:01:20 -
+Rule sol87 1987 only - Jun 21 12:01:35s -0:01:35 -
+Rule sol87 1987 only - Jun 22 12:01:50s -0:01:50 -
+Rule sol87 1987 only - Jun 23 12:02:00s -0:02:00 -
+Rule sol87 1987 only - Jun 24 12:02:15s -0:02:15 -
+Rule sol87 1987 only - Jun 25 12:02:25s -0:02:25 -
+Rule sol87 1987 only - Jun 26 12:02:40s -0:02:40 -
+Rule sol87 1987 only - Jun 27 12:02:50s -0:02:50 -
+Rule sol87 1987 only - Jun 28 12:03:05s -0:03:05 -
+Rule sol87 1987 only - Jun 29 12:03:15s -0:03:15 -
+Rule sol87 1987 only - Jun 30 12:03:30s -0:03:30 -
+Rule sol87 1987 only - Jul 1 12:03:40s -0:03:40 -
+Rule sol87 1987 only - Jul 2 12:03:50s -0:03:50 -
+Rule sol87 1987 only - Jul 3 12:04:05s -0:04:05 -
+Rule sol87 1987 only - Jul 4 12:04:15s -0:04:15 -
+Rule sol87 1987 only - Jul 5 12:04:25s -0:04:25 -
+Rule sol87 1987 only - Jul 6 12:04:35s -0:04:35 -
+Rule sol87 1987 only - Jul 7 12:04:45s -0:04:45 -
+Rule sol87 1987 only - Jul 8 12:04:55s -0:04:55 -
+Rule sol87 1987 only - Jul 9 12:05:05s -0:05:05 -
+Rule sol87 1987 only - Jul 10 12:05:15s -0:05:15 -
+Rule sol87 1987 only - Jul 11 12:05:20s -0:05:20 -
+Rule sol87 1987 only - Jul 12 12:05:30s -0:05:30 -
+Rule sol87 1987 only - Jul 13 12:05:40s -0:05:40 -
+Rule sol87 1987 only - Jul 14 12:05:45s -0:05:45 -
+Rule sol87 1987 only - Jul 15 12:05:50s -0:05:50 -
+Rule sol87 1987 only - Jul 16 12:06:00s -0:06:00 -
+Rule sol87 1987 only - Jul 17 12:06:05s -0:06:05 -
+Rule sol87 1987 only - Jul 18 12:06:10s -0:06:10 -
+Rule sol87 1987 only - Jul 19 12:06:15s -0:06:15 -
+Rule sol87 1987 only - Jul 20 12:06:15s -0:06:15 -
+Rule sol87 1987 only - Jul 21 12:06:20s -0:06:20 -
+Rule sol87 1987 only - Jul 22 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 23 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 24 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 25 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 26 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 27 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 28 12:06:30s -0:06:30 -
+Rule sol87 1987 only - Jul 29 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 30 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Jul 31 12:06:25s -0:06:25 -
+Rule sol87 1987 only - Aug 1 12:06:20s -0:06:20 -
+Rule sol87 1987 only - Aug 2 12:06:15s -0:06:15 -
+Rule sol87 1987 only - Aug 3 12:06:10s -0:06:10 -
+Rule sol87 1987 only - Aug 4 12:06:05s -0:06:05 -
+Rule sol87 1987 only - Aug 5 12:06:00s -0:06:00 -
+Rule sol87 1987 only - Aug 6 12:05:55s -0:05:55 -
+Rule sol87 1987 only - Aug 7 12:05:50s -0:05:50 -
+Rule sol87 1987 only - Aug 8 12:05:40s -0:05:40 -
+Rule sol87 1987 only - Aug 9 12:05:35s -0:05:35 -
+Rule sol87 1987 only - Aug 10 12:05:25s -0:05:25 -
+Rule sol87 1987 only - Aug 11 12:05:15s -0:05:15 -
+Rule sol87 1987 only - Aug 12 12:05:05s -0:05:05 -
+Rule sol87 1987 only - Aug 13 12:04:55s -0:04:55 -
+Rule sol87 1987 only - Aug 14 12:04:45s -0:04:45 -
+Rule sol87 1987 only - Aug 15 12:04:35s -0:04:35 -
+Rule sol87 1987 only - Aug 16 12:04:25s -0:04:25 -
+Rule sol87 1987 only - Aug 17 12:04:10s -0:04:10 -
+Rule sol87 1987 only - Aug 18 12:04:00s -0:04:00 -
+Rule sol87 1987 only - Aug 19 12:03:45s -0:03:45 -
+Rule sol87 1987 only - Aug 20 12:03:30s -0:03:30 -
+Rule sol87 1987 only - Aug 21 12:03:15s -0:03:15 -
+Rule sol87 1987 only - Aug 22 12:03:00s -0:03:00 -
+Rule sol87 1987 only - Aug 23 12:02:45s -0:02:45 -
+Rule sol87 1987 only - Aug 24 12:02:30s -0:02:30 -
+Rule sol87 1987 only - Aug 25 12:02:15s -0:02:15 -
+Rule sol87 1987 only - Aug 26 12:02:00s -0:02:00 -
+Rule sol87 1987 only - Aug 27 12:01:40s -0:01:40 -
+Rule sol87 1987 only - Aug 28 12:01:25s -0:01:25 -
+Rule sol87 1987 only - Aug 29 12:01:05s -0:01:05 -
+Rule sol87 1987 only - Aug 30 12:00:50s -0:00:50 -
+Rule sol87 1987 only - Aug 31 12:00:30s -0:00:30 -
+Rule sol87 1987 only - Sep 1 12:00:10s -0:00:10 -
+Rule sol87 1987 only - Sep 2 11:59:50s 0:00:10 -
+Rule sol87 1987 only - Sep 3 11:59:35s 0:00:25 -
+Rule sol87 1987 only - Sep 4 11:59:15s 0:00:45 -
+Rule sol87 1987 only - Sep 5 11:58:55s 0:01:05 -
+Rule sol87 1987 only - Sep 6 11:58:35s 0:01:25 -
+Rule sol87 1987 only - Sep 7 11:58:15s 0:01:45 -
+Rule sol87 1987 only - Sep 8 11:57:55s 0:02:05 -
+Rule sol87 1987 only - Sep 9 11:57:30s 0:02:30 -
+Rule sol87 1987 only - Sep 10 11:57:10s 0:02:50 -
+Rule sol87 1987 only - Sep 11 11:56:50s 0:03:10 -
+Rule sol87 1987 only - Sep 12 11:56:30s 0:03:30 -
+Rule sol87 1987 only - Sep 13 11:56:10s 0:03:50 -
+Rule sol87 1987 only - Sep 14 11:55:45s 0:04:15 -
+Rule sol87 1987 only - Sep 15 11:55:25s 0:04:35 -
+Rule sol87 1987 only - Sep 16 11:55:05s 0:04:55 -
+Rule sol87 1987 only - Sep 17 11:54:45s 0:05:15 -
+Rule sol87 1987 only - Sep 18 11:54:20s 0:05:40 -
+Rule sol87 1987 only - Sep 19 11:54:00s 0:06:00 -
+Rule sol87 1987 only - Sep 20 11:53:40s 0:06:20 -
+Rule sol87 1987 only - Sep 21 11:53:15s 0:06:45 -
+Rule sol87 1987 only - Sep 22 11:52:55s 0:07:05 -
+Rule sol87 1987 only - Sep 23 11:52:35s 0:07:25 -
+Rule sol87 1987 only - Sep 24 11:52:15s 0:07:45 -
+Rule sol87 1987 only - Sep 25 11:51:55s 0:08:05 -
+Rule sol87 1987 only - Sep 26 11:51:35s 0:08:25 -
+Rule sol87 1987 only - Sep 27 11:51:10s 0:08:50 -
+Rule sol87 1987 only - Sep 28 11:50:50s 0:09:10 -
+Rule sol87 1987 only - Sep 29 11:50:30s 0:09:30 -
+Rule sol87 1987 only - Sep 30 11:50:10s 0:09:50 -
+Rule sol87 1987 only - Oct 1 11:49:50s 0:10:10 -
+Rule sol87 1987 only - Oct 2 11:49:35s 0:10:25 -
+Rule sol87 1987 only - Oct 3 11:49:15s 0:10:45 -
+Rule sol87 1987 only - Oct 4 11:48:55s 0:11:05 -
+Rule sol87 1987 only - Oct 5 11:48:35s 0:11:25 -
+Rule sol87 1987 only - Oct 6 11:48:20s 0:11:40 -
+Rule sol87 1987 only - Oct 7 11:48:00s 0:12:00 -
+Rule sol87 1987 only - Oct 8 11:47:45s 0:12:15 -
+Rule sol87 1987 only - Oct 9 11:47:25s 0:12:35 -
+Rule sol87 1987 only - Oct 10 11:47:10s 0:12:50 -
+Rule sol87 1987 only - Oct 11 11:46:55s 0:13:05 -
+Rule sol87 1987 only - Oct 12 11:46:40s 0:13:20 -
+Rule sol87 1987 only - Oct 13 11:46:25s 0:13:35 -
+Rule sol87 1987 only - Oct 14 11:46:10s 0:13:50 -
+Rule sol87 1987 only - Oct 15 11:45:55s 0:14:05 -
+Rule sol87 1987 only - Oct 16 11:45:45s 0:14:15 -
+Rule sol87 1987 only - Oct 17 11:45:30s 0:14:30 -
+Rule sol87 1987 only - Oct 18 11:45:20s 0:14:40 -
+Rule sol87 1987 only - Oct 19 11:45:05s 0:14:55 -
+Rule sol87 1987 only - Oct 20 11:44:55s 0:15:05 -
+Rule sol87 1987 only - Oct 21 11:44:45s 0:15:15 -
+Rule sol87 1987 only - Oct 22 11:44:35s 0:15:25 -
+Rule sol87 1987 only - Oct 23 11:44:25s 0:15:35 -
+Rule sol87 1987 only - Oct 24 11:44:20s 0:15:40 -
+Rule sol87 1987 only - Oct 25 11:44:10s 0:15:50 -
+Rule sol87 1987 only - Oct 26 11:44:05s 0:15:55 -
+Rule sol87 1987 only - Oct 27 11:43:55s 0:16:05 -
+Rule sol87 1987 only - Oct 28 11:43:50s 0:16:10 -
+Rule sol87 1987 only - Oct 29 11:43:45s 0:16:15 -
+Rule sol87 1987 only - Oct 30 11:43:45s 0:16:15 -
+Rule sol87 1987 only - Oct 31 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 1 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 2 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 3 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 4 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 5 11:43:35s 0:16:25 -
+Rule sol87 1987 only - Nov 6 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 7 11:43:40s 0:16:20 -
+Rule sol87 1987 only - Nov 8 11:43:45s 0:16:15 -
+Rule sol87 1987 only - Nov 9 11:43:50s 0:16:10 -
+Rule sol87 1987 only - Nov 10 11:43:55s 0:16:05 -
+Rule sol87 1987 only - Nov 11 11:44:00s 0:16:00 -
+Rule sol87 1987 only - Nov 12 11:44:05s 0:15:55 -
+Rule sol87 1987 only - Nov 13 11:44:15s 0:15:45 -
+Rule sol87 1987 only - Nov 14 11:44:20s 0:15:40 -
+Rule sol87 1987 only - Nov 15 11:44:30s 0:15:30 -
+Rule sol87 1987 only - Nov 16 11:44:40s 0:15:20 -
+Rule sol87 1987 only - Nov 17 11:44:50s 0:15:10 -
+Rule sol87 1987 only - Nov 18 11:45:05s 0:14:55 -
+Rule sol87 1987 only - Nov 19 11:45:15s 0:14:45 -
+Rule sol87 1987 only - Nov 20 11:45:30s 0:14:30 -
+Rule sol87 1987 only - Nov 21 11:45:45s 0:14:15 -
+Rule sol87 1987 only - Nov 22 11:46:00s 0:14:00 -
+Rule sol87 1987 only - Nov 23 11:46:15s 0:13:45 -
+Rule sol87 1987 only - Nov 24 11:46:30s 0:13:30 -
+Rule sol87 1987 only - Nov 25 11:46:50s 0:13:10 -
+Rule sol87 1987 only - Nov 26 11:47:10s 0:12:50 -
+Rule sol87 1987 only - Nov 27 11:47:25s 0:12:35 -
+Rule sol87 1987 only - Nov 28 11:47:45s 0:12:15 -
+Rule sol87 1987 only - Nov 29 11:48:05s 0:11:55 -
+Rule sol87 1987 only - Nov 30 11:48:30s 0:11:30 -
+Rule sol87 1987 only - Dec 1 11:48:50s 0:11:10 -
+Rule sol87 1987 only - Dec 2 11:49:10s 0:10:50 -
+Rule sol87 1987 only - Dec 3 11:49:35s 0:10:25 -
+Rule sol87 1987 only - Dec 4 11:50:00s 0:10:00 -
+Rule sol87 1987 only - Dec 5 11:50:25s 0:09:35 -
+Rule sol87 1987 only - Dec 6 11:50:50s 0:09:10 -
+Rule sol87 1987 only - Dec 7 11:51:15s 0:08:45 -
+Rule sol87 1987 only - Dec 8 11:51:40s 0:08:20 -
+Rule sol87 1987 only - Dec 9 11:52:05s 0:07:55 -
+Rule sol87 1987 only - Dec 10 11:52:30s 0:07:30 -
+Rule sol87 1987 only - Dec 11 11:53:00s 0:07:00 -
+Rule sol87 1987 only - Dec 12 11:53:25s 0:06:35 -
+Rule sol87 1987 only - Dec 13 11:53:55s 0:06:05 -
+Rule sol87 1987 only - Dec 14 11:54:25s 0:05:35 -
+Rule sol87 1987 only - Dec 15 11:54:50s 0:05:10 -
+Rule sol87 1987 only - Dec 16 11:55:20s 0:04:40 -
+Rule sol87 1987 only - Dec 17 11:55:50s 0:04:10 -
+Rule sol87 1987 only - Dec 18 11:56:20s 0:03:40 -
+Rule sol87 1987 only - Dec 19 11:56:50s 0:03:10 -
+Rule sol87 1987 only - Dec 20 11:57:20s 0:02:40 -
+Rule sol87 1987 only - Dec 21 11:57:50s 0:02:10 -
+Rule sol87 1987 only - Dec 22 11:58:20s 0:01:40 -
+Rule sol87 1987 only - Dec 23 11:58:50s 0:01:10 -
+Rule sol87 1987 only - Dec 24 11:59:20s 0:00:40 -
+Rule sol87 1987 only - Dec 25 11:59:50s 0:00:10 -
+Rule sol87 1987 only - Dec 26 12:00:20s -0:00:20 -
+Rule sol87 1987 only - Dec 27 12:00:45s -0:00:45 -
+Rule sol87 1987 only - Dec 28 12:01:15s -0:01:15 -
+Rule sol87 1987 only - Dec 29 12:01:45s -0:01:45 -
+Rule sol87 1987 only - Dec 30 12:02:15s -0:02:15 -
+Rule sol87 1987 only - Dec 31 12:02:45s -0:02:45 -
+
+# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
+# Before and after 1987, we'll operate on local mean solar time.
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Mideast/Riyadh87 3:07:04 - ?? 1987
+ 3:07:04 sol87 ?? 1988
+ 3:07:04 - ??
diff --git a/share/zoneinfo/datfiles/solar88 b/share/zoneinfo/datfiles/solar88
new file mode 100644
index 0000000..e7f647e
--- /dev/null
+++ b/share/zoneinfo/datfiles/solar88
@@ -0,0 +1,386 @@
+# @(#)solar88 4.2
+
+# Apparent noon times below are for Riyadh; they're a bit off for other places.
+# Times were computed using formulas in the U.S. Naval Observatory's
+# Almanac for Computers 1988; the formulas "will give EqT to an accuracy of
+# [plus or minus two] seconds during the current year."
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule sol88 1988 only - Jan 1 12:03:15s -0:03:15 -
+Rule sol88 1988 only - Jan 2 12:03:40s -0:03:40 -
+Rule sol88 1988 only - Jan 3 12:04:10s -0:04:10 -
+Rule sol88 1988 only - Jan 4 12:04:40s -0:04:40 -
+Rule sol88 1988 only - Jan 5 12:05:05s -0:05:05 -
+Rule sol88 1988 only - Jan 6 12:05:30s -0:05:30 -
+Rule sol88 1988 only - Jan 7 12:06:00s -0:06:00 -
+Rule sol88 1988 only - Jan 8 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jan 9 12:06:50s -0:06:50 -
+Rule sol88 1988 only - Jan 10 12:07:15s -0:07:15 -
+Rule sol88 1988 only - Jan 11 12:07:40s -0:07:40 -
+Rule sol88 1988 only - Jan 12 12:08:05s -0:08:05 -
+Rule sol88 1988 only - Jan 13 12:08:25s -0:08:25 -
+Rule sol88 1988 only - Jan 14 12:08:50s -0:08:50 -
+Rule sol88 1988 only - Jan 15 12:09:10s -0:09:10 -
+Rule sol88 1988 only - Jan 16 12:09:30s -0:09:30 -
+Rule sol88 1988 only - Jan 17 12:09:50s -0:09:50 -
+Rule sol88 1988 only - Jan 18 12:10:10s -0:10:10 -
+Rule sol88 1988 only - Jan 19 12:10:30s -0:10:30 -
+Rule sol88 1988 only - Jan 20 12:10:50s -0:10:50 -
+Rule sol88 1988 only - Jan 21 12:11:05s -0:11:05 -
+Rule sol88 1988 only - Jan 22 12:11:25s -0:11:25 -
+Rule sol88 1988 only - Jan 23 12:11:40s -0:11:40 -
+Rule sol88 1988 only - Jan 24 12:11:55s -0:11:55 -
+Rule sol88 1988 only - Jan 25 12:12:10s -0:12:10 -
+Rule sol88 1988 only - Jan 26 12:12:25s -0:12:25 -
+Rule sol88 1988 only - Jan 27 12:12:40s -0:12:40 -
+Rule sol88 1988 only - Jan 28 12:12:50s -0:12:50 -
+Rule sol88 1988 only - Jan 29 12:13:00s -0:13:00 -
+Rule sol88 1988 only - Jan 30 12:13:10s -0:13:10 -
+Rule sol88 1988 only - Jan 31 12:13:20s -0:13:20 -
+Rule sol88 1988 only - Feb 1 12:13:30s -0:13:30 -
+Rule sol88 1988 only - Feb 2 12:13:40s -0:13:40 -
+Rule sol88 1988 only - Feb 3 12:13:45s -0:13:45 -
+Rule sol88 1988 only - Feb 4 12:13:55s -0:13:55 -
+Rule sol88 1988 only - Feb 5 12:14:00s -0:14:00 -
+Rule sol88 1988 only - Feb 6 12:14:05s -0:14:05 -
+Rule sol88 1988 only - Feb 7 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 8 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 9 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 10 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 11 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 12 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 13 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 14 12:14:15s -0:14:15 -
+Rule sol88 1988 only - Feb 15 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 16 12:14:10s -0:14:10 -
+Rule sol88 1988 only - Feb 17 12:14:05s -0:14:05 -
+Rule sol88 1988 only - Feb 18 12:14:00s -0:14:00 -
+Rule sol88 1988 only - Feb 19 12:13:55s -0:13:55 -
+Rule sol88 1988 only - Feb 20 12:13:50s -0:13:50 -
+Rule sol88 1988 only - Feb 21 12:13:45s -0:13:45 -
+Rule sol88 1988 only - Feb 22 12:13:40s -0:13:40 -
+Rule sol88 1988 only - Feb 23 12:13:30s -0:13:30 -
+Rule sol88 1988 only - Feb 24 12:13:20s -0:13:20 -
+Rule sol88 1988 only - Feb 25 12:13:15s -0:13:15 -
+Rule sol88 1988 only - Feb 26 12:13:05s -0:13:05 -
+Rule sol88 1988 only - Feb 27 12:12:55s -0:12:55 -
+Rule sol88 1988 only - Feb 28 12:12:45s -0:12:45 -
+Rule sol88 1988 only - Feb 29 12:12:30s -0:12:30 -
+Rule sol88 1988 only - Mar 1 12:12:20s -0:12:20 -
+Rule sol88 1988 only - Mar 2 12:12:10s -0:12:10 -
+Rule sol88 1988 only - Mar 3 12:11:55s -0:11:55 -
+Rule sol88 1988 only - Mar 4 12:11:45s -0:11:45 -
+Rule sol88 1988 only - Mar 5 12:11:30s -0:11:30 -
+Rule sol88 1988 only - Mar 6 12:11:15s -0:11:15 -
+Rule sol88 1988 only - Mar 7 12:11:00s -0:11:00 -
+Rule sol88 1988 only - Mar 8 12:10:45s -0:10:45 -
+Rule sol88 1988 only - Mar 9 12:10:30s -0:10:30 -
+Rule sol88 1988 only - Mar 10 12:10:15s -0:10:15 -
+Rule sol88 1988 only - Mar 11 12:10:00s -0:10:00 -
+Rule sol88 1988 only - Mar 12 12:09:45s -0:09:45 -
+Rule sol88 1988 only - Mar 13 12:09:30s -0:09:30 -
+Rule sol88 1988 only - Mar 14 12:09:10s -0:09:10 -
+Rule sol88 1988 only - Mar 15 12:08:55s -0:08:55 -
+Rule sol88 1988 only - Mar 16 12:08:40s -0:08:40 -
+Rule sol88 1988 only - Mar 17 12:08:20s -0:08:20 -
+Rule sol88 1988 only - Mar 18 12:08:05s -0:08:05 -
+Rule sol88 1988 only - Mar 19 12:07:45s -0:07:45 -
+Rule sol88 1988 only - Mar 20 12:07:30s -0:07:30 -
+Rule sol88 1988 only - Mar 21 12:07:10s -0:07:10 -
+Rule sol88 1988 only - Mar 22 12:06:50s -0:06:50 -
+Rule sol88 1988 only - Mar 23 12:06:35s -0:06:35 -
+Rule sol88 1988 only - Mar 24 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Mar 25 12:06:00s -0:06:00 -
+Rule sol88 1988 only - Mar 26 12:05:40s -0:05:40 -
+Rule sol88 1988 only - Mar 27 12:05:20s -0:05:20 -
+Rule sol88 1988 only - Mar 28 12:05:05s -0:05:05 -
+Rule sol88 1988 only - Mar 29 12:04:45s -0:04:45 -
+Rule sol88 1988 only - Mar 30 12:04:25s -0:04:25 -
+Rule sol88 1988 only - Mar 31 12:04:10s -0:04:10 -
+Rule sol88 1988 only - Apr 1 12:03:50s -0:03:50 -
+Rule sol88 1988 only - Apr 2 12:03:35s -0:03:35 -
+Rule sol88 1988 only - Apr 3 12:03:15s -0:03:15 -
+Rule sol88 1988 only - Apr 4 12:03:00s -0:03:00 -
+Rule sol88 1988 only - Apr 5 12:02:40s -0:02:40 -
+Rule sol88 1988 only - Apr 6 12:02:25s -0:02:25 -
+Rule sol88 1988 only - Apr 7 12:02:05s -0:02:05 -
+Rule sol88 1988 only - Apr 8 12:01:50s -0:01:50 -
+Rule sol88 1988 only - Apr 9 12:01:35s -0:01:35 -
+Rule sol88 1988 only - Apr 10 12:01:15s -0:01:15 -
+Rule sol88 1988 only - Apr 11 12:01:00s -0:01:00 -
+Rule sol88 1988 only - Apr 12 12:00:45s -0:00:45 -
+Rule sol88 1988 only - Apr 13 12:00:30s -0:00:30 -
+Rule sol88 1988 only - Apr 14 12:00:15s -0:00:15 -
+Rule sol88 1988 only - Apr 15 12:00:00s 0:00:00 -
+Rule sol88 1988 only - Apr 16 11:59:45s 0:00:15 -
+Rule sol88 1988 only - Apr 17 11:59:30s 0:00:30 -
+Rule sol88 1988 only - Apr 18 11:59:20s 0:00:40 -
+Rule sol88 1988 only - Apr 19 11:59:05s 0:00:55 -
+Rule sol88 1988 only - Apr 20 11:58:55s 0:01:05 -
+Rule sol88 1988 only - Apr 21 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Apr 22 11:58:30s 0:01:30 -
+Rule sol88 1988 only - Apr 23 11:58:15s 0:01:45 -
+Rule sol88 1988 only - Apr 24 11:58:05s 0:01:55 -
+Rule sol88 1988 only - Apr 25 11:57:55s 0:02:05 -
+Rule sol88 1988 only - Apr 26 11:57:45s 0:02:15 -
+Rule sol88 1988 only - Apr 27 11:57:35s 0:02:25 -
+Rule sol88 1988 only - Apr 28 11:57:30s 0:02:30 -
+Rule sol88 1988 only - Apr 29 11:57:20s 0:02:40 -
+Rule sol88 1988 only - Apr 30 11:57:10s 0:02:50 -
+Rule sol88 1988 only - May 1 11:57:05s 0:02:55 -
+Rule sol88 1988 only - May 2 11:56:55s 0:03:05 -
+Rule sol88 1988 only - May 3 11:56:50s 0:03:10 -
+Rule sol88 1988 only - May 4 11:56:45s 0:03:15 -
+Rule sol88 1988 only - May 5 11:56:40s 0:03:20 -
+Rule sol88 1988 only - May 6 11:56:35s 0:03:25 -
+Rule sol88 1988 only - May 7 11:56:30s 0:03:30 -
+Rule sol88 1988 only - May 8 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 9 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 10 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 11 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 12 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 13 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 14 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 15 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 16 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 17 11:56:20s 0:03:40 -
+Rule sol88 1988 only - May 18 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 19 11:56:25s 0:03:35 -
+Rule sol88 1988 only - May 20 11:56:30s 0:03:30 -
+Rule sol88 1988 only - May 21 11:56:35s 0:03:25 -
+Rule sol88 1988 only - May 22 11:56:40s 0:03:20 -
+Rule sol88 1988 only - May 23 11:56:45s 0:03:15 -
+Rule sol88 1988 only - May 24 11:56:50s 0:03:10 -
+Rule sol88 1988 only - May 25 11:56:55s 0:03:05 -
+Rule sol88 1988 only - May 26 11:57:00s 0:03:00 -
+Rule sol88 1988 only - May 27 11:57:05s 0:02:55 -
+Rule sol88 1988 only - May 28 11:57:15s 0:02:45 -
+Rule sol88 1988 only - May 29 11:57:20s 0:02:40 -
+Rule sol88 1988 only - May 30 11:57:30s 0:02:30 -
+Rule sol88 1988 only - May 31 11:57:40s 0:02:20 -
+Rule sol88 1988 only - Jun 1 11:57:50s 0:02:10 -
+Rule sol88 1988 only - Jun 2 11:57:55s 0:02:05 -
+Rule sol88 1988 only - Jun 3 11:58:05s 0:01:55 -
+Rule sol88 1988 only - Jun 4 11:58:15s 0:01:45 -
+Rule sol88 1988 only - Jun 5 11:58:30s 0:01:30 -
+Rule sol88 1988 only - Jun 6 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Jun 7 11:58:50s 0:01:10 -
+Rule sol88 1988 only - Jun 8 11:59:00s 0:01:00 -
+Rule sol88 1988 only - Jun 9 11:59:15s 0:00:45 -
+Rule sol88 1988 only - Jun 10 11:59:25s 0:00:35 -
+Rule sol88 1988 only - Jun 11 11:59:35s 0:00:25 -
+Rule sol88 1988 only - Jun 12 11:59:50s 0:00:10 -
+Rule sol88 1988 only - Jun 13 12:00:00s 0:00:00 -
+Rule sol88 1988 only - Jun 14 12:00:15s -0:00:15 -
+Rule sol88 1988 only - Jun 15 12:00:25s -0:00:25 -
+Rule sol88 1988 only - Jun 16 12:00:40s -0:00:40 -
+Rule sol88 1988 only - Jun 17 12:00:55s -0:00:55 -
+Rule sol88 1988 only - Jun 18 12:01:05s -0:01:05 -
+Rule sol88 1988 only - Jun 19 12:01:20s -0:01:20 -
+Rule sol88 1988 only - Jun 20 12:01:30s -0:01:30 -
+Rule sol88 1988 only - Jun 21 12:01:45s -0:01:45 -
+Rule sol88 1988 only - Jun 22 12:02:00s -0:02:00 -
+Rule sol88 1988 only - Jun 23 12:02:10s -0:02:10 -
+Rule sol88 1988 only - Jun 24 12:02:25s -0:02:25 -
+Rule sol88 1988 only - Jun 25 12:02:35s -0:02:35 -
+Rule sol88 1988 only - Jun 26 12:02:50s -0:02:50 -
+Rule sol88 1988 only - Jun 27 12:03:00s -0:03:00 -
+Rule sol88 1988 only - Jun 28 12:03:15s -0:03:15 -
+Rule sol88 1988 only - Jun 29 12:03:25s -0:03:25 -
+Rule sol88 1988 only - Jun 30 12:03:40s -0:03:40 -
+Rule sol88 1988 only - Jul 1 12:03:50s -0:03:50 -
+Rule sol88 1988 only - Jul 2 12:04:00s -0:04:00 -
+Rule sol88 1988 only - Jul 3 12:04:10s -0:04:10 -
+Rule sol88 1988 only - Jul 4 12:04:25s -0:04:25 -
+Rule sol88 1988 only - Jul 5 12:04:35s -0:04:35 -
+Rule sol88 1988 only - Jul 6 12:04:45s -0:04:45 -
+Rule sol88 1988 only - Jul 7 12:04:55s -0:04:55 -
+Rule sol88 1988 only - Jul 8 12:05:05s -0:05:05 -
+Rule sol88 1988 only - Jul 9 12:05:10s -0:05:10 -
+Rule sol88 1988 only - Jul 10 12:05:20s -0:05:20 -
+Rule sol88 1988 only - Jul 11 12:05:30s -0:05:30 -
+Rule sol88 1988 only - Jul 12 12:05:35s -0:05:35 -
+Rule sol88 1988 only - Jul 13 12:05:45s -0:05:45 -
+Rule sol88 1988 only - Jul 14 12:05:50s -0:05:50 -
+Rule sol88 1988 only - Jul 15 12:05:55s -0:05:55 -
+Rule sol88 1988 only - Jul 16 12:06:00s -0:06:00 -
+Rule sol88 1988 only - Jul 17 12:06:05s -0:06:05 -
+Rule sol88 1988 only - Jul 18 12:06:10s -0:06:10 -
+Rule sol88 1988 only - Jul 19 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Jul 20 12:06:20s -0:06:20 -
+Rule sol88 1988 only - Jul 21 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 22 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 23 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 24 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 25 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 26 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 27 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 28 12:06:30s -0:06:30 -
+Rule sol88 1988 only - Jul 29 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 30 12:06:25s -0:06:25 -
+Rule sol88 1988 only - Jul 31 12:06:20s -0:06:20 -
+Rule sol88 1988 only - Aug 1 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Aug 2 12:06:15s -0:06:15 -
+Rule sol88 1988 only - Aug 3 12:06:10s -0:06:10 -
+Rule sol88 1988 only - Aug 4 12:06:05s -0:06:05 -
+Rule sol88 1988 only - Aug 5 12:05:55s -0:05:55 -
+Rule sol88 1988 only - Aug 6 12:05:50s -0:05:50 -
+Rule sol88 1988 only - Aug 7 12:05:45s -0:05:45 -
+Rule sol88 1988 only - Aug 8 12:05:35s -0:05:35 -
+Rule sol88 1988 only - Aug 9 12:05:25s -0:05:25 -
+Rule sol88 1988 only - Aug 10 12:05:20s -0:05:20 -
+Rule sol88 1988 only - Aug 11 12:05:10s -0:05:10 -
+Rule sol88 1988 only - Aug 12 12:05:00s -0:05:00 -
+Rule sol88 1988 only - Aug 13 12:04:50s -0:04:50 -
+Rule sol88 1988 only - Aug 14 12:04:35s -0:04:35 -
+Rule sol88 1988 only - Aug 15 12:04:25s -0:04:25 -
+Rule sol88 1988 only - Aug 16 12:04:15s -0:04:15 -
+Rule sol88 1988 only - Aug 17 12:04:00s -0:04:00 -
+Rule sol88 1988 only - Aug 18 12:03:50s -0:03:50 -
+Rule sol88 1988 only - Aug 19 12:03:35s -0:03:35 -
+Rule sol88 1988 only - Aug 20 12:03:20s -0:03:20 -
+Rule sol88 1988 only - Aug 21 12:03:05s -0:03:05 -
+Rule sol88 1988 only - Aug 22 12:02:50s -0:02:50 -
+Rule sol88 1988 only - Aug 23 12:02:35s -0:02:35 -
+Rule sol88 1988 only - Aug 24 12:02:20s -0:02:20 -
+Rule sol88 1988 only - Aug 25 12:02:00s -0:02:00 -
+Rule sol88 1988 only - Aug 26 12:01:45s -0:01:45 -
+Rule sol88 1988 only - Aug 27 12:01:30s -0:01:30 -
+Rule sol88 1988 only - Aug 28 12:01:10s -0:01:10 -
+Rule sol88 1988 only - Aug 29 12:00:50s -0:00:50 -
+Rule sol88 1988 only - Aug 30 12:00:35s -0:00:35 -
+Rule sol88 1988 only - Aug 31 12:00:15s -0:00:15 -
+Rule sol88 1988 only - Sep 1 11:59:55s 0:00:05 -
+Rule sol88 1988 only - Sep 2 11:59:35s 0:00:25 -
+Rule sol88 1988 only - Sep 3 11:59:20s 0:00:40 -
+Rule sol88 1988 only - Sep 4 11:59:00s 0:01:00 -
+Rule sol88 1988 only - Sep 5 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Sep 6 11:58:20s 0:01:40 -
+Rule sol88 1988 only - Sep 7 11:58:00s 0:02:00 -
+Rule sol88 1988 only - Sep 8 11:57:35s 0:02:25 -
+Rule sol88 1988 only - Sep 9 11:57:15s 0:02:45 -
+Rule sol88 1988 only - Sep 10 11:56:55s 0:03:05 -
+Rule sol88 1988 only - Sep 11 11:56:35s 0:03:25 -
+Rule sol88 1988 only - Sep 12 11:56:15s 0:03:45 -
+Rule sol88 1988 only - Sep 13 11:55:50s 0:04:10 -
+Rule sol88 1988 only - Sep 14 11:55:30s 0:04:30 -
+Rule sol88 1988 only - Sep 15 11:55:10s 0:04:50 -
+Rule sol88 1988 only - Sep 16 11:54:50s 0:05:10 -
+Rule sol88 1988 only - Sep 17 11:54:25s 0:05:35 -
+Rule sol88 1988 only - Sep 18 11:54:05s 0:05:55 -
+Rule sol88 1988 only - Sep 19 11:53:45s 0:06:15 -
+Rule sol88 1988 only - Sep 20 11:53:25s 0:06:35 -
+Rule sol88 1988 only - Sep 21 11:53:00s 0:07:00 -
+Rule sol88 1988 only - Sep 22 11:52:40s 0:07:20 -
+Rule sol88 1988 only - Sep 23 11:52:20s 0:07:40 -
+Rule sol88 1988 only - Sep 24 11:52:00s 0:08:00 -
+Rule sol88 1988 only - Sep 25 11:51:40s 0:08:20 -
+Rule sol88 1988 only - Sep 26 11:51:15s 0:08:45 -
+Rule sol88 1988 only - Sep 27 11:50:55s 0:09:05 -
+Rule sol88 1988 only - Sep 28 11:50:35s 0:09:25 -
+Rule sol88 1988 only - Sep 29 11:50:15s 0:09:45 -
+Rule sol88 1988 only - Sep 30 11:49:55s 0:10:05 -
+Rule sol88 1988 only - Oct 1 11:49:35s 0:10:25 -
+Rule sol88 1988 only - Oct 2 11:49:20s 0:10:40 -
+Rule sol88 1988 only - Oct 3 11:49:00s 0:11:00 -
+Rule sol88 1988 only - Oct 4 11:48:40s 0:11:20 -
+Rule sol88 1988 only - Oct 5 11:48:25s 0:11:35 -
+Rule sol88 1988 only - Oct 6 11:48:05s 0:11:55 -
+Rule sol88 1988 only - Oct 7 11:47:50s 0:12:10 -
+Rule sol88 1988 only - Oct 8 11:47:30s 0:12:30 -
+Rule sol88 1988 only - Oct 9 11:47:15s 0:12:45 -
+Rule sol88 1988 only - Oct 10 11:47:00s 0:13:00 -
+Rule sol88 1988 only - Oct 11 11:46:45s 0:13:15 -
+Rule sol88 1988 only - Oct 12 11:46:30s 0:13:30 -
+Rule sol88 1988 only - Oct 13 11:46:15s 0:13:45 -
+Rule sol88 1988 only - Oct 14 11:46:00s 0:14:00 -
+Rule sol88 1988 only - Oct 15 11:45:45s 0:14:15 -
+Rule sol88 1988 only - Oct 16 11:45:35s 0:14:25 -
+Rule sol88 1988 only - Oct 17 11:45:20s 0:14:40 -
+Rule sol88 1988 only - Oct 18 11:45:10s 0:14:50 -
+Rule sol88 1988 only - Oct 19 11:45:00s 0:15:00 -
+Rule sol88 1988 only - Oct 20 11:44:45s 0:15:15 -
+Rule sol88 1988 only - Oct 21 11:44:40s 0:15:20 -
+Rule sol88 1988 only - Oct 22 11:44:30s 0:15:30 -
+Rule sol88 1988 only - Oct 23 11:44:20s 0:15:40 -
+Rule sol88 1988 only - Oct 24 11:44:10s 0:15:50 -
+Rule sol88 1988 only - Oct 25 11:44:05s 0:15:55 -
+Rule sol88 1988 only - Oct 26 11:44:00s 0:16:00 -
+Rule sol88 1988 only - Oct 27 11:43:55s 0:16:05 -
+Rule sol88 1988 only - Oct 28 11:43:50s 0:16:10 -
+Rule sol88 1988 only - Oct 29 11:43:45s 0:16:15 -
+Rule sol88 1988 only - Oct 30 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Oct 31 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Nov 1 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 2 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 3 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 4 11:43:35s 0:16:25 -
+Rule sol88 1988 only - Nov 5 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Nov 6 11:43:40s 0:16:20 -
+Rule sol88 1988 only - Nov 7 11:43:45s 0:16:15 -
+Rule sol88 1988 only - Nov 8 11:43:45s 0:16:15 -
+Rule sol88 1988 only - Nov 9 11:43:50s 0:16:10 -
+Rule sol88 1988 only - Nov 10 11:44:00s 0:16:00 -
+Rule sol88 1988 only - Nov 11 11:44:05s 0:15:55 -
+Rule sol88 1988 only - Nov 12 11:44:10s 0:15:50 -
+Rule sol88 1988 only - Nov 13 11:44:20s 0:15:40 -
+Rule sol88 1988 only - Nov 14 11:44:30s 0:15:30 -
+Rule sol88 1988 only - Nov 15 11:44:40s 0:15:20 -
+Rule sol88 1988 only - Nov 16 11:44:50s 0:15:10 -
+Rule sol88 1988 only - Nov 17 11:45:00s 0:15:00 -
+Rule sol88 1988 only - Nov 18 11:45:15s 0:14:45 -
+Rule sol88 1988 only - Nov 19 11:45:25s 0:14:35 -
+Rule sol88 1988 only - Nov 20 11:45:40s 0:14:20 -
+Rule sol88 1988 only - Nov 21 11:45:55s 0:14:05 -
+Rule sol88 1988 only - Nov 22 11:46:10s 0:13:50 -
+Rule sol88 1988 only - Nov 23 11:46:30s 0:13:30 -
+Rule sol88 1988 only - Nov 24 11:46:45s 0:13:15 -
+Rule sol88 1988 only - Nov 25 11:47:05s 0:12:55 -
+Rule sol88 1988 only - Nov 26 11:47:20s 0:12:40 -
+Rule sol88 1988 only - Nov 27 11:47:40s 0:12:20 -
+Rule sol88 1988 only - Nov 28 11:48:00s 0:12:00 -
+Rule sol88 1988 only - Nov 29 11:48:25s 0:11:35 -
+Rule sol88 1988 only - Nov 30 11:48:45s 0:11:15 -
+Rule sol88 1988 only - Dec 1 11:49:05s 0:10:55 -
+Rule sol88 1988 only - Dec 2 11:49:30s 0:10:30 -
+Rule sol88 1988 only - Dec 3 11:49:55s 0:10:05 -
+Rule sol88 1988 only - Dec 4 11:50:15s 0:09:45 -
+Rule sol88 1988 only - Dec 5 11:50:40s 0:09:20 -
+Rule sol88 1988 only - Dec 6 11:51:05s 0:08:55 -
+Rule sol88 1988 only - Dec 7 11:51:35s 0:08:25 -
+Rule sol88 1988 only - Dec 8 11:52:00s 0:08:00 -
+Rule sol88 1988 only - Dec 9 11:52:25s 0:07:35 -
+Rule sol88 1988 only - Dec 10 11:52:55s 0:07:05 -
+Rule sol88 1988 only - Dec 11 11:53:20s 0:06:40 -
+Rule sol88 1988 only - Dec 12 11:53:50s 0:06:10 -
+Rule sol88 1988 only - Dec 13 11:54:15s 0:05:45 -
+Rule sol88 1988 only - Dec 14 11:54:45s 0:05:15 -
+Rule sol88 1988 only - Dec 15 11:55:15s 0:04:45 -
+Rule sol88 1988 only - Dec 16 11:55:45s 0:04:15 -
+Rule sol88 1988 only - Dec 17 11:56:15s 0:03:45 -
+Rule sol88 1988 only - Dec 18 11:56:40s 0:03:20 -
+Rule sol88 1988 only - Dec 19 11:57:10s 0:02:50 -
+Rule sol88 1988 only - Dec 20 11:57:40s 0:02:20 -
+Rule sol88 1988 only - Dec 21 11:58:10s 0:01:50 -
+Rule sol88 1988 only - Dec 22 11:58:40s 0:01:20 -
+Rule sol88 1988 only - Dec 23 11:59:10s 0:00:50 -
+Rule sol88 1988 only - Dec 24 11:59:40s 0:00:20 -
+Rule sol88 1988 only - Dec 25 12:00:10s -0:00:10 -
+Rule sol88 1988 only - Dec 26 12:00:40s -0:00:40 -
+Rule sol88 1988 only - Dec 27 12:01:10s -0:01:10 -
+Rule sol88 1988 only - Dec 28 12:01:40s -0:01:40 -
+Rule sol88 1988 only - Dec 29 12:02:10s -0:02:10 -
+Rule sol88 1988 only - Dec 30 12:02:35s -0:02:35 -
+Rule sol88 1988 only - Dec 31 12:03:05s -0:03:05 -
+
+# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
+# Before and after 1988, we'll operate on local mean solar time.
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Mideast/Riyadh88 3:07:04 - ?? 1988
+ 3:07:04 sol88 ?? 1989
+ 3:07:04 - ??
diff --git a/share/zoneinfo/datfiles/solar89 b/share/zoneinfo/datfiles/solar89
new file mode 100644
index 0000000..4f25170
--- /dev/null
+++ b/share/zoneinfo/datfiles/solar89
@@ -0,0 +1,391 @@
+# @(#)solar89 1.3
+
+# Apparent noon times below are for Riyadh; they're a bit off for other places.
+# Times were computed using a formula provided by the U. S. Naval Observatory:
+# eqt = -105.8 * sin(l) + 596.2 * sin(2 * l) + 4.4 * sin(3 * l)
+# -12.7 * sin(4 * l) - 429.0 * cos(l) - 2.1 * cos (2 * l)
+# + 19.3 * cos(3 * l);
+# where l is the "mean longitude of the Sun" given by
+# l = 279.642 degrees + 0.985647 * d
+# and d is the interval in days from January 0, 0 hours Universal Time
+# (equaling the day of the year plus the fraction of a day from zero hours).
+# The accuracy of the formula is plus or minus three seconds.
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule sol89 1989 only - Jan 1 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Jan 2 12:04:05s -0:04:05 -
+Rule sol89 1989 only - Jan 3 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Jan 4 12:05:00s -0:05:00 -
+Rule sol89 1989 only - Jan 5 12:05:25s -0:05:25 -
+Rule sol89 1989 only - Jan 6 12:05:50s -0:05:50 -
+Rule sol89 1989 only - Jan 7 12:06:15s -0:06:15 -
+Rule sol89 1989 only - Jan 8 12:06:45s -0:06:45 -
+Rule sol89 1989 only - Jan 9 12:07:10s -0:07:10 -
+Rule sol89 1989 only - Jan 10 12:07:35s -0:07:35 -
+Rule sol89 1989 only - Jan 11 12:07:55s -0:07:55 -
+Rule sol89 1989 only - Jan 12 12:08:20s -0:08:20 -
+Rule sol89 1989 only - Jan 13 12:08:45s -0:08:45 -
+Rule sol89 1989 only - Jan 14 12:09:05s -0:09:05 -
+Rule sol89 1989 only - Jan 15 12:09:25s -0:09:25 -
+Rule sol89 1989 only - Jan 16 12:09:45s -0:09:45 -
+Rule sol89 1989 only - Jan 17 12:10:05s -0:10:05 -
+Rule sol89 1989 only - Jan 18 12:10:25s -0:10:25 -
+Rule sol89 1989 only - Jan 19 12:10:45s -0:10:45 -
+Rule sol89 1989 only - Jan 20 12:11:05s -0:11:05 -
+Rule sol89 1989 only - Jan 21 12:11:20s -0:11:20 -
+Rule sol89 1989 only - Jan 22 12:11:35s -0:11:35 -
+Rule sol89 1989 only - Jan 23 12:11:55s -0:11:55 -
+Rule sol89 1989 only - Jan 24 12:12:10s -0:12:10 -
+Rule sol89 1989 only - Jan 25 12:12:20s -0:12:20 -
+Rule sol89 1989 only - Jan 26 12:12:35s -0:12:35 -
+Rule sol89 1989 only - Jan 27 12:12:50s -0:12:50 -
+Rule sol89 1989 only - Jan 28 12:13:00s -0:13:00 -
+Rule sol89 1989 only - Jan 29 12:13:10s -0:13:10 -
+Rule sol89 1989 only - Jan 30 12:13:20s -0:13:20 -
+Rule sol89 1989 only - Jan 31 12:13:30s -0:13:30 -
+Rule sol89 1989 only - Feb 1 12:13:40s -0:13:40 -
+Rule sol89 1989 only - Feb 2 12:13:45s -0:13:45 -
+Rule sol89 1989 only - Feb 3 12:13:55s -0:13:55 -
+Rule sol89 1989 only - Feb 4 12:14:00s -0:14:00 -
+Rule sol89 1989 only - Feb 5 12:14:05s -0:14:05 -
+Rule sol89 1989 only - Feb 6 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 7 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 8 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 9 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 10 12:14:20s -0:14:20 -
+Rule sol89 1989 only - Feb 11 12:14:20s -0:14:20 -
+Rule sol89 1989 only - Feb 12 12:14:20s -0:14:20 -
+Rule sol89 1989 only - Feb 13 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 14 12:14:15s -0:14:15 -
+Rule sol89 1989 only - Feb 15 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 16 12:14:10s -0:14:10 -
+Rule sol89 1989 only - Feb 17 12:14:05s -0:14:05 -
+Rule sol89 1989 only - Feb 18 12:14:00s -0:14:00 -
+Rule sol89 1989 only - Feb 19 12:13:55s -0:13:55 -
+Rule sol89 1989 only - Feb 20 12:13:50s -0:13:50 -
+Rule sol89 1989 only - Feb 21 12:13:40s -0:13:40 -
+Rule sol89 1989 only - Feb 22 12:13:35s -0:13:35 -
+Rule sol89 1989 only - Feb 23 12:13:25s -0:13:25 -
+Rule sol89 1989 only - Feb 24 12:13:15s -0:13:15 -
+Rule sol89 1989 only - Feb 25 12:13:05s -0:13:05 -
+Rule sol89 1989 only - Feb 26 12:12:55s -0:12:55 -
+Rule sol89 1989 only - Feb 27 12:12:45s -0:12:45 -
+Rule sol89 1989 only - Feb 28 12:12:35s -0:12:35 -
+Rule sol89 1989 only - Mar 1 12:12:25s -0:12:25 -
+Rule sol89 1989 only - Mar 2 12:12:10s -0:12:10 -
+Rule sol89 1989 only - Mar 3 12:12:00s -0:12:00 -
+Rule sol89 1989 only - Mar 4 12:11:45s -0:11:45 -
+Rule sol89 1989 only - Mar 5 12:11:35s -0:11:35 -
+Rule sol89 1989 only - Mar 6 12:11:20s -0:11:20 -
+Rule sol89 1989 only - Mar 7 12:11:05s -0:11:05 -
+Rule sol89 1989 only - Mar 8 12:10:50s -0:10:50 -
+Rule sol89 1989 only - Mar 9 12:10:35s -0:10:35 -
+Rule sol89 1989 only - Mar 10 12:10:20s -0:10:20 -
+Rule sol89 1989 only - Mar 11 12:10:05s -0:10:05 -
+Rule sol89 1989 only - Mar 12 12:09:50s -0:09:50 -
+Rule sol89 1989 only - Mar 13 12:09:30s -0:09:30 -
+Rule sol89 1989 only - Mar 14 12:09:15s -0:09:15 -
+Rule sol89 1989 only - Mar 15 12:09:00s -0:09:00 -
+Rule sol89 1989 only - Mar 16 12:08:40s -0:08:40 -
+Rule sol89 1989 only - Mar 17 12:08:25s -0:08:25 -
+Rule sol89 1989 only - Mar 18 12:08:05s -0:08:05 -
+Rule sol89 1989 only - Mar 19 12:07:50s -0:07:50 -
+Rule sol89 1989 only - Mar 20 12:07:30s -0:07:30 -
+Rule sol89 1989 only - Mar 21 12:07:15s -0:07:15 -
+Rule sol89 1989 only - Mar 22 12:06:55s -0:06:55 -
+Rule sol89 1989 only - Mar 23 12:06:35s -0:06:35 -
+Rule sol89 1989 only - Mar 24 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Mar 25 12:06:00s -0:06:00 -
+Rule sol89 1989 only - Mar 26 12:05:40s -0:05:40 -
+Rule sol89 1989 only - Mar 27 12:05:25s -0:05:25 -
+Rule sol89 1989 only - Mar 28 12:05:05s -0:05:05 -
+Rule sol89 1989 only - Mar 29 12:04:50s -0:04:50 -
+Rule sol89 1989 only - Mar 30 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Mar 31 12:04:10s -0:04:10 -
+Rule sol89 1989 only - Apr 1 12:03:55s -0:03:55 -
+Rule sol89 1989 only - Apr 2 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Apr 3 12:03:20s -0:03:20 -
+Rule sol89 1989 only - Apr 4 12:03:00s -0:03:00 -
+Rule sol89 1989 only - Apr 5 12:02:45s -0:02:45 -
+Rule sol89 1989 only - Apr 6 12:02:25s -0:02:25 -
+Rule sol89 1989 only - Apr 7 12:02:10s -0:02:10 -
+Rule sol89 1989 only - Apr 8 12:01:50s -0:01:50 -
+Rule sol89 1989 only - Apr 9 12:01:35s -0:01:35 -
+Rule sol89 1989 only - Apr 10 12:01:20s -0:01:20 -
+Rule sol89 1989 only - Apr 11 12:01:05s -0:01:05 -
+Rule sol89 1989 only - Apr 12 12:00:50s -0:00:50 -
+Rule sol89 1989 only - Apr 13 12:00:35s -0:00:35 -
+Rule sol89 1989 only - Apr 14 12:00:20s -0:00:20 -
+Rule sol89 1989 only - Apr 15 12:00:05s -0:00:05 -
+Rule sol89 1989 only - Apr 16 11:59:50s 0:00:10 -
+Rule sol89 1989 only - Apr 17 11:59:35s 0:00:25 -
+Rule sol89 1989 only - Apr 18 11:59:20s 0:00:40 -
+Rule sol89 1989 only - Apr 19 11:59:10s 0:00:50 -
+Rule sol89 1989 only - Apr 20 11:58:55s 0:01:05 -
+Rule sol89 1989 only - Apr 21 11:58:45s 0:01:15 -
+Rule sol89 1989 only - Apr 22 11:58:30s 0:01:30 -
+Rule sol89 1989 only - Apr 23 11:58:20s 0:01:40 -
+Rule sol89 1989 only - Apr 24 11:58:10s 0:01:50 -
+Rule sol89 1989 only - Apr 25 11:58:00s 0:02:00 -
+Rule sol89 1989 only - Apr 26 11:57:50s 0:02:10 -
+Rule sol89 1989 only - Apr 27 11:57:40s 0:02:20 -
+Rule sol89 1989 only - Apr 28 11:57:30s 0:02:30 -
+Rule sol89 1989 only - Apr 29 11:57:20s 0:02:40 -
+Rule sol89 1989 only - Apr 30 11:57:15s 0:02:45 -
+Rule sol89 1989 only - May 1 11:57:05s 0:02:55 -
+Rule sol89 1989 only - May 2 11:57:00s 0:03:00 -
+Rule sol89 1989 only - May 3 11:56:50s 0:03:10 -
+Rule sol89 1989 only - May 4 11:56:45s 0:03:15 -
+Rule sol89 1989 only - May 5 11:56:40s 0:03:20 -
+Rule sol89 1989 only - May 6 11:56:35s 0:03:25 -
+Rule sol89 1989 only - May 7 11:56:30s 0:03:30 -
+Rule sol89 1989 only - May 8 11:56:30s 0:03:30 -
+Rule sol89 1989 only - May 9 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 10 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 11 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 12 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 13 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 14 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 15 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 16 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 17 11:56:20s 0:03:40 -
+Rule sol89 1989 only - May 18 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 19 11:56:25s 0:03:35 -
+Rule sol89 1989 only - May 20 11:56:30s 0:03:30 -
+Rule sol89 1989 only - May 21 11:56:35s 0:03:25 -
+Rule sol89 1989 only - May 22 11:56:35s 0:03:25 -
+Rule sol89 1989 only - May 23 11:56:40s 0:03:20 -
+Rule sol89 1989 only - May 24 11:56:45s 0:03:15 -
+Rule sol89 1989 only - May 25 11:56:55s 0:03:05 -
+Rule sol89 1989 only - May 26 11:57:00s 0:03:00 -
+Rule sol89 1989 only - May 27 11:57:05s 0:02:55 -
+Rule sol89 1989 only - May 28 11:57:15s 0:02:45 -
+Rule sol89 1989 only - May 29 11:57:20s 0:02:40 -
+Rule sol89 1989 only - May 30 11:57:30s 0:02:30 -
+Rule sol89 1989 only - May 31 11:57:35s 0:02:25 -
+Rule sol89 1989 only - Jun 1 11:57:45s 0:02:15 -
+Rule sol89 1989 only - Jun 2 11:57:55s 0:02:05 -
+Rule sol89 1989 only - Jun 3 11:58:05s 0:01:55 -
+Rule sol89 1989 only - Jun 4 11:58:15s 0:01:45 -
+Rule sol89 1989 only - Jun 5 11:58:25s 0:01:35 -
+Rule sol89 1989 only - Jun 6 11:58:35s 0:01:25 -
+Rule sol89 1989 only - Jun 7 11:58:45s 0:01:15 -
+Rule sol89 1989 only - Jun 8 11:59:00s 0:01:00 -
+Rule sol89 1989 only - Jun 9 11:59:10s 0:00:50 -
+Rule sol89 1989 only - Jun 10 11:59:20s 0:00:40 -
+Rule sol89 1989 only - Jun 11 11:59:35s 0:00:25 -
+Rule sol89 1989 only - Jun 12 11:59:45s 0:00:15 -
+Rule sol89 1989 only - Jun 13 12:00:00s 0:00:00 -
+Rule sol89 1989 only - Jun 14 12:00:10s -0:00:10 -
+Rule sol89 1989 only - Jun 15 12:00:25s -0:00:25 -
+Rule sol89 1989 only - Jun 16 12:00:35s -0:00:35 -
+Rule sol89 1989 only - Jun 17 12:00:50s -0:00:50 -
+Rule sol89 1989 only - Jun 18 12:01:05s -0:01:05 -
+Rule sol89 1989 only - Jun 19 12:01:15s -0:01:15 -
+Rule sol89 1989 only - Jun 20 12:01:30s -0:01:30 -
+Rule sol89 1989 only - Jun 21 12:01:40s -0:01:40 -
+Rule sol89 1989 only - Jun 22 12:01:55s -0:01:55 -
+Rule sol89 1989 only - Jun 23 12:02:10s -0:02:10 -
+Rule sol89 1989 only - Jun 24 12:02:20s -0:02:20 -
+Rule sol89 1989 only - Jun 25 12:02:35s -0:02:35 -
+Rule sol89 1989 only - Jun 26 12:02:45s -0:02:45 -
+Rule sol89 1989 only - Jun 27 12:03:00s -0:03:00 -
+Rule sol89 1989 only - Jun 28 12:03:10s -0:03:10 -
+Rule sol89 1989 only - Jun 29 12:03:25s -0:03:25 -
+Rule sol89 1989 only - Jun 30 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Jul 1 12:03:45s -0:03:45 -
+Rule sol89 1989 only - Jul 2 12:04:00s -0:04:00 -
+Rule sol89 1989 only - Jul 3 12:04:10s -0:04:10 -
+Rule sol89 1989 only - Jul 4 12:04:20s -0:04:20 -
+Rule sol89 1989 only - Jul 5 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Jul 6 12:04:40s -0:04:40 -
+Rule sol89 1989 only - Jul 7 12:04:50s -0:04:50 -
+Rule sol89 1989 only - Jul 8 12:05:00s -0:05:00 -
+Rule sol89 1989 only - Jul 9 12:05:10s -0:05:10 -
+Rule sol89 1989 only - Jul 10 12:05:20s -0:05:20 -
+Rule sol89 1989 only - Jul 11 12:05:25s -0:05:25 -
+Rule sol89 1989 only - Jul 12 12:05:35s -0:05:35 -
+Rule sol89 1989 only - Jul 13 12:05:40s -0:05:40 -
+Rule sol89 1989 only - Jul 14 12:05:50s -0:05:50 -
+Rule sol89 1989 only - Jul 15 12:05:55s -0:05:55 -
+Rule sol89 1989 only - Jul 16 12:06:00s -0:06:00 -
+Rule sol89 1989 only - Jul 17 12:06:05s -0:06:05 -
+Rule sol89 1989 only - Jul 18 12:06:10s -0:06:10 -
+Rule sol89 1989 only - Jul 19 12:06:15s -0:06:15 -
+Rule sol89 1989 only - Jul 20 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Jul 21 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Jul 22 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 23 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 24 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 25 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 26 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 27 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 28 12:06:30s -0:06:30 -
+Rule sol89 1989 only - Jul 29 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 30 12:06:25s -0:06:25 -
+Rule sol89 1989 only - Jul 31 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Aug 1 12:06:20s -0:06:20 -
+Rule sol89 1989 only - Aug 2 12:06:15s -0:06:15 -
+Rule sol89 1989 only - Aug 3 12:06:10s -0:06:10 -
+Rule sol89 1989 only - Aug 4 12:06:05s -0:06:05 -
+Rule sol89 1989 only - Aug 5 12:06:00s -0:06:00 -
+Rule sol89 1989 only - Aug 6 12:05:50s -0:05:50 -
+Rule sol89 1989 only - Aug 7 12:05:45s -0:05:45 -
+Rule sol89 1989 only - Aug 8 12:05:35s -0:05:35 -
+Rule sol89 1989 only - Aug 9 12:05:30s -0:05:30 -
+Rule sol89 1989 only - Aug 10 12:05:20s -0:05:20 -
+Rule sol89 1989 only - Aug 11 12:05:10s -0:05:10 -
+Rule sol89 1989 only - Aug 12 12:05:00s -0:05:00 -
+Rule sol89 1989 only - Aug 13 12:04:50s -0:04:50 -
+Rule sol89 1989 only - Aug 14 12:04:40s -0:04:40 -
+Rule sol89 1989 only - Aug 15 12:04:30s -0:04:30 -
+Rule sol89 1989 only - Aug 16 12:04:15s -0:04:15 -
+Rule sol89 1989 only - Aug 17 12:04:05s -0:04:05 -
+Rule sol89 1989 only - Aug 18 12:03:50s -0:03:50 -
+Rule sol89 1989 only - Aug 19 12:03:35s -0:03:35 -
+Rule sol89 1989 only - Aug 20 12:03:25s -0:03:25 -
+Rule sol89 1989 only - Aug 21 12:03:10s -0:03:10 -
+Rule sol89 1989 only - Aug 22 12:02:55s -0:02:55 -
+Rule sol89 1989 only - Aug 23 12:02:40s -0:02:40 -
+Rule sol89 1989 only - Aug 24 12:02:20s -0:02:20 -
+Rule sol89 1989 only - Aug 25 12:02:05s -0:02:05 -
+Rule sol89 1989 only - Aug 26 12:01:50s -0:01:50 -
+Rule sol89 1989 only - Aug 27 12:01:30s -0:01:30 -
+Rule sol89 1989 only - Aug 28 12:01:15s -0:01:15 -
+Rule sol89 1989 only - Aug 29 12:00:55s -0:00:55 -
+Rule sol89 1989 only - Aug 30 12:00:40s -0:00:40 -
+Rule sol89 1989 only - Aug 31 12:00:20s -0:00:20 -
+Rule sol89 1989 only - Sep 1 12:00:00s 0:00:00 -
+Rule sol89 1989 only - Sep 2 11:59:45s 0:00:15 -
+Rule sol89 1989 only - Sep 3 11:59:25s 0:00:35 -
+Rule sol89 1989 only - Sep 4 11:59:05s 0:00:55 -
+Rule sol89 1989 only - Sep 5 11:58:45s 0:01:15 -
+Rule sol89 1989 only - Sep 6 11:58:25s 0:01:35 -
+Rule sol89 1989 only - Sep 7 11:58:05s 0:01:55 -
+Rule sol89 1989 only - Sep 8 11:57:45s 0:02:15 -
+Rule sol89 1989 only - Sep 9 11:57:20s 0:02:40 -
+Rule sol89 1989 only - Sep 10 11:57:00s 0:03:00 -
+Rule sol89 1989 only - Sep 11 11:56:40s 0:03:20 -
+Rule sol89 1989 only - Sep 12 11:56:20s 0:03:40 -
+Rule sol89 1989 only - Sep 13 11:56:00s 0:04:00 -
+Rule sol89 1989 only - Sep 14 11:55:35s 0:04:25 -
+Rule sol89 1989 only - Sep 15 11:55:15s 0:04:45 -
+Rule sol89 1989 only - Sep 16 11:54:55s 0:05:05 -
+Rule sol89 1989 only - Sep 17 11:54:35s 0:05:25 -
+Rule sol89 1989 only - Sep 18 11:54:10s 0:05:50 -
+Rule sol89 1989 only - Sep 19 11:53:50s 0:06:10 -
+Rule sol89 1989 only - Sep 20 11:53:30s 0:06:30 -
+Rule sol89 1989 only - Sep 21 11:53:10s 0:06:50 -
+Rule sol89 1989 only - Sep 22 11:52:45s 0:07:15 -
+Rule sol89 1989 only - Sep 23 11:52:25s 0:07:35 -
+Rule sol89 1989 only - Sep 24 11:52:05s 0:07:55 -
+Rule sol89 1989 only - Sep 25 11:51:45s 0:08:15 -
+Rule sol89 1989 only - Sep 26 11:51:25s 0:08:35 -
+Rule sol89 1989 only - Sep 27 11:51:05s 0:08:55 -
+Rule sol89 1989 only - Sep 28 11:50:40s 0:09:20 -
+Rule sol89 1989 only - Sep 29 11:50:20s 0:09:40 -
+Rule sol89 1989 only - Sep 30 11:50:00s 0:10:00 -
+Rule sol89 1989 only - Oct 1 11:49:45s 0:10:15 -
+Rule sol89 1989 only - Oct 2 11:49:25s 0:10:35 -
+Rule sol89 1989 only - Oct 3 11:49:05s 0:10:55 -
+Rule sol89 1989 only - Oct 4 11:48:45s 0:11:15 -
+Rule sol89 1989 only - Oct 5 11:48:30s 0:11:30 -
+Rule sol89 1989 only - Oct 6 11:48:10s 0:11:50 -
+Rule sol89 1989 only - Oct 7 11:47:50s 0:12:10 -
+Rule sol89 1989 only - Oct 8 11:47:35s 0:12:25 -
+Rule sol89 1989 only - Oct 9 11:47:20s 0:12:40 -
+Rule sol89 1989 only - Oct 10 11:47:00s 0:13:00 -
+Rule sol89 1989 only - Oct 11 11:46:45s 0:13:15 -
+Rule sol89 1989 only - Oct 12 11:46:30s 0:13:30 -
+Rule sol89 1989 only - Oct 13 11:46:15s 0:13:45 -
+Rule sol89 1989 only - Oct 14 11:46:00s 0:14:00 -
+Rule sol89 1989 only - Oct 15 11:45:50s 0:14:10 -
+Rule sol89 1989 only - Oct 16 11:45:35s 0:14:25 -
+Rule sol89 1989 only - Oct 17 11:45:20s 0:14:40 -
+Rule sol89 1989 only - Oct 18 11:45:10s 0:14:50 -
+Rule sol89 1989 only - Oct 19 11:45:00s 0:15:00 -
+Rule sol89 1989 only - Oct 20 11:44:50s 0:15:10 -
+Rule sol89 1989 only - Oct 21 11:44:40s 0:15:20 -
+Rule sol89 1989 only - Oct 22 11:44:30s 0:15:30 -
+Rule sol89 1989 only - Oct 23 11:44:20s 0:15:40 -
+Rule sol89 1989 only - Oct 24 11:44:10s 0:15:50 -
+Rule sol89 1989 only - Oct 25 11:44:05s 0:15:55 -
+Rule sol89 1989 only - Oct 26 11:44:00s 0:16:00 -
+Rule sol89 1989 only - Oct 27 11:43:50s 0:16:10 -
+Rule sol89 1989 only - Oct 28 11:43:45s 0:16:15 -
+Rule sol89 1989 only - Oct 29 11:43:40s 0:16:20 -
+Rule sol89 1989 only - Oct 30 11:43:40s 0:16:20 -
+Rule sol89 1989 only - Oct 31 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 1 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 2 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 3 11:43:30s 0:16:30 -
+Rule sol89 1989 only - Nov 4 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 5 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 6 11:43:35s 0:16:25 -
+Rule sol89 1989 only - Nov 7 11:43:40s 0:16:20 -
+Rule sol89 1989 only - Nov 8 11:43:45s 0:16:15 -
+Rule sol89 1989 only - Nov 9 11:43:50s 0:16:10 -
+Rule sol89 1989 only - Nov 10 11:43:55s 0:16:05 -
+Rule sol89 1989 only - Nov 11 11:44:00s 0:16:00 -
+Rule sol89 1989 only - Nov 12 11:44:05s 0:15:55 -
+Rule sol89 1989 only - Nov 13 11:44:15s 0:15:45 -
+Rule sol89 1989 only - Nov 14 11:44:25s 0:15:35 -
+Rule sol89 1989 only - Nov 15 11:44:35s 0:15:25 -
+Rule sol89 1989 only - Nov 16 11:44:45s 0:15:15 -
+Rule sol89 1989 only - Nov 17 11:44:55s 0:15:05 -
+Rule sol89 1989 only - Nov 18 11:45:10s 0:14:50 -
+Rule sol89 1989 only - Nov 19 11:45:20s 0:14:40 -
+Rule sol89 1989 only - Nov 20 11:45:35s 0:14:25 -
+Rule sol89 1989 only - Nov 21 11:45:50s 0:14:10 -
+Rule sol89 1989 only - Nov 22 11:46:05s 0:13:55 -
+Rule sol89 1989 only - Nov 23 11:46:25s 0:13:35 -
+Rule sol89 1989 only - Nov 24 11:46:40s 0:13:20 -
+Rule sol89 1989 only - Nov 25 11:47:00s 0:13:00 -
+Rule sol89 1989 only - Nov 26 11:47:20s 0:12:40 -
+Rule sol89 1989 only - Nov 27 11:47:35s 0:12:25 -
+Rule sol89 1989 only - Nov 28 11:47:55s 0:12:05 -
+Rule sol89 1989 only - Nov 29 11:48:20s 0:11:40 -
+Rule sol89 1989 only - Nov 30 11:48:40s 0:11:20 -
+Rule sol89 1989 only - Dec 1 11:49:00s 0:11:00 -
+Rule sol89 1989 only - Dec 2 11:49:25s 0:10:35 -
+Rule sol89 1989 only - Dec 3 11:49:50s 0:10:10 -
+Rule sol89 1989 only - Dec 4 11:50:15s 0:09:45 -
+Rule sol89 1989 only - Dec 5 11:50:35s 0:09:25 -
+Rule sol89 1989 only - Dec 6 11:51:00s 0:09:00 -
+Rule sol89 1989 only - Dec 7 11:51:30s 0:08:30 -
+Rule sol89 1989 only - Dec 8 11:51:55s 0:08:05 -
+Rule sol89 1989 only - Dec 9 11:52:20s 0:07:40 -
+Rule sol89 1989 only - Dec 10 11:52:50s 0:07:10 -
+Rule sol89 1989 only - Dec 11 11:53:15s 0:06:45 -
+Rule sol89 1989 only - Dec 12 11:53:45s 0:06:15 -
+Rule sol89 1989 only - Dec 13 11:54:10s 0:05:50 -
+Rule sol89 1989 only - Dec 14 11:54:40s 0:05:20 -
+Rule sol89 1989 only - Dec 15 11:55:10s 0:04:50 -
+Rule sol89 1989 only - Dec 16 11:55:40s 0:04:20 -
+Rule sol89 1989 only - Dec 17 11:56:05s 0:03:55 -
+Rule sol89 1989 only - Dec 18 11:56:35s 0:03:25 -
+Rule sol89 1989 only - Dec 19 11:57:05s 0:02:55 -
+Rule sol89 1989 only - Dec 20 11:57:35s 0:02:25 -
+Rule sol89 1989 only - Dec 21 11:58:05s 0:01:55 -
+Rule sol89 1989 only - Dec 22 11:58:35s 0:01:25 -
+Rule sol89 1989 only - Dec 23 11:59:05s 0:00:55 -
+Rule sol89 1989 only - Dec 24 11:59:35s 0:00:25 -
+Rule sol89 1989 only - Dec 25 12:00:05s -0:00:05 -
+Rule sol89 1989 only - Dec 26 12:00:35s -0:00:35 -
+Rule sol89 1989 only - Dec 27 12:01:05s -0:01:05 -
+Rule sol89 1989 only - Dec 28 12:01:35s -0:01:35 -
+Rule sol89 1989 only - Dec 29 12:02:00s -0:02:00 -
+Rule sol89 1989 only - Dec 30 12:02:30s -0:02:30 -
+Rule sol89 1989 only - Dec 31 12:03:00s -0:03:00 -
+
+# Riyadh is at about 46 degrees 46 minutes East: 3 hrs, 7 mins, 4 secs
+# Before and after 1989, we'll operate on local mean solar time.
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Mideast/Riyadh89 3:07:04 - ?? 1989
+ 3:07:04 sol89 ?? 1990
+ 3:07:04 - ??
diff --git a/share/zoneinfo/datfiles/southamerica b/share/zoneinfo/datfiles/southamerica
new file mode 100644
index 0000000..abab105
--- /dev/null
+++ b/share/zoneinfo/datfiles/southamerica
@@ -0,0 +1,103 @@
+# @(#)southamerica 4.3
+
+# From Guy Harris:
+# From Official Airline Guide - Worldwide Edition (1987). Countries not
+# listed here do not observe DST, according to the OAG. Time zone names
+# are pure inventions, and none are supplied for countries not observing
+# DST; updates from natives would be appreciated. The times that DST
+# starts and ends are based on the assumption that they switch a 2AM just
+# as everybody else does.
+
+###############################################################################
+
+# Brazil
+
+# From Guy Harris:
+# The OAG lists October 25, 1987 and February 12, 1988 as the starting and
+# ending dates, giving them as "estimated date(s) based on previous year". We
+# infer a rule here from one example, always a dangerous practice.... Yes,
+# they really do switch on Saturday, according to the OAG.
+# "Brazil/Acre" is for the Territory of Acre; "Brazil/DeNoronha" is for
+# Fernando De Noronha.
+
+# From Bob Devine (January 28, 1988):
+# The only information I found is that there was no DST up to 1985.
+# But there was some before 1952!
+
+# From U. S. Naval Observatory (January 16, 1989):
+# BRAZIL WEST 5 H BEHIND UTC TERRITORY OF ACRE
+# BRAZIL WEST 4 H BEHIND UTC ACRE OCT 23, '88-FEB 11,
+# BRAZIL '89 (ESTIMATED)
+# BRAZIL CENTRAL 4 H BEHIND UTC MANAUS
+# BRAZIL CENTRAL 3 H BEHIND UTC MANAUS OCT 23, '88-FEB 11,
+# BRAZIL CENTRAL '89 (ESTIMATED)
+# BRAZIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SAO
+# BRAZIL EAST PAULO, BRASILIA
+# BRAZIL EAST 2 H BEHIND UTC COASTAL STATES, RIO, SAO
+# BRAZIL PAULO, BRASILIA OCT 23,
+# BRAZIL '88-FEB 11, '89
+# BRAZIL (ESTIMATED)
+# BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS, FERNANDO
+# BRAZIL DE NORONHA
+# BRAZIL 1 H BEHIND UTC OCT 23, '88-FEB 11, '89
+# BRAZIL (ESTIMATED)
+# BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Brazil 1987 max - Feb Sat<=14 2:00 0 S
+Rule Brazil 1987 max - Oct Sat<=28 2:00 1:00 D
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Brazil/East -3:00 Brazil E%sT
+Zone Brazil/West -4:00 Brazil W%sT
+Zone Brazil/Acre -5:00 Brazil A%sT
+Zone Brazil/DeNoronha -2:00 Brazil F%sT
+
+###############################################################################
+
+# Chile
+
+# From Guy Harris:
+# The OAG lists October 11, 1987 and March 12, 1988 as the starting and
+# ending dates, giving them as "estimated date(s) based on previous year."
+
+# From Bob Devine (January 28, 1988):
+# Chile has had 2nd Sunday in October to 2nd Sunday in March DST since 1977.
+# Switch is at midnight. OAG is right.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Chile 1977 max - Oct Sun>=8 0:00 1:00 D
+Rule Chile 1978 max - Mar Sun>=8 0:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone Chile/Continental -4:00 Chile C%sT
+Zone Chile/EasterIsland -6:00 Chile E%sT
+
+###############################################################################
+
+# Paraguay
+
+# From Bob Devine (January 28, 1988):
+# Paraguay: First day in October to last in March. Midnight switch??
+# Since 1980.
+
+# From U. S. Naval Observatory (January 19, 1989):
+# PARAGUAY 4 H BEHIND UTC
+# PARAGUAY 3 H BEHIND UTC OCT 1, '88-MAR 31, '89
+
+# From Arthur David Olson (January 21, 1989):
+# Still don't know time of day when switch occurs. Punt.
+
+###############################################################################
+
+# Argentina
+
+# From Bob Devine (January 28, 1988):
+# Argentina: first Sunday in October to first Sunday in April since 1976.
+# Double Summer time from 1969 to 1974. Switches at midnight.
+
+# From U. S. Naval Observatory (January 19, 19889):
+# ARGENTINA 3 H BEHIND UTC
+
+# From Arthur David Olson (January 21, 1989):
+# OAG, USNO and Bob have different data. Punt.
diff --git a/share/zoneinfo/datfiles/systemv b/share/zoneinfo/datfiles/systemv
new file mode 100644
index 0000000..8dc7bed
--- /dev/null
+++ b/share/zoneinfo/datfiles/systemv
@@ -0,0 +1,35 @@
+# @(#)systemv 4.1
+
+# Old rules, should the need arise.
+# No attempt is made to handle Newfoundland, since it cannot be expressed
+# using the System V "TZ" scheme (half-hour offset), or anything outside
+# North America (no support for non-standard DST start/end dates), nor
+# the change in the DST rules in the US in 1987 (can't split between
+# Canada, with no changes, and the US)
+#
+# Be sure to compile this *without* leap second correction for true conformance.
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule SystemV min 1973 - Apr lastSun 2:00 1:00 D
+Rule SystemV min 1973 - Oct lastSun 2:00 0 S
+Rule SystemV 1974 only - Jan 6 2:00 1:00 D
+Rule SystemV 1974 only - Nov lastSun 2:00 0 S
+Rule SystemV 1975 only - Feb 23 2:00 1:00 D
+Rule SystemV 1975 only - Oct lastSun 2:00 0 S
+Rule SystemV 1976 max - Apr lastSun 2:00 1:00 D
+Rule SystemV 1976 max - Oct lastSun 2:00 0 S
+
+# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+Zone SystemV/AST4ADT -4:00 SystemV A%sT
+Zone SystemV/EST5EDT -5:00 SystemV E%sT
+Zone SystemV/CST6CDT -6:00 SystemV C%sT
+Zone SystemV/MST7MDT -7:00 SystemV M%sT
+Zone SystemV/PST8PDT -8:00 SystemV P%sT
+Zone SystemV/YST9YDT -9:00 SystemV Y%sT
+Zone SystemV/AST4 -4:00 - AST
+Zone SystemV/EST5 -5:00 - EST
+Zone SystemV/CST6 -6:00 - CST
+Zone SystemV/MST7 -7:00 - MST
+Zone SystemV/PST8 -8:00 - PST
+Zone SystemV/YST9 -9:00 - YST
+Zone SystemV/HST10 -10:00 - HST
diff --git a/share/zoneinfo/datfiles/usno1988 b/share/zoneinfo/datfiles/usno1988
new file mode 100644
index 0000000..12d14ce
--- /dev/null
+++ b/share/zoneinfo/datfiles/usno1988
@@ -0,0 +1,111 @@
+# @(#)usno1988 1.1
+#
+# From Arthur David Olson (January 19, 1989):
+#
+# Here's some United States Naval Observatory time zone data from
+# February 1988. It's here mostly to convince you that the USNO has indeed
+# been updating its files (see its 1989 data elsewhere).
+#
+ANDORRA 1 H AHEAD OF UTC
+ARGENTINA 3 H BEHIND UTC
+BRASIL WEST 5 H BEHIND UTC (CRUZEIRO DO SUL)
+BRASIL CENTRAL 4 H BEHIND UTC (MANAUS)
+BRASIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SP, BRASILIA
+BRASIL 2 H BEHIND UTC ATLANTIC ISLANDS
+BRAZIL 5 H BEHIND UTC WEST (CRUZEIRO DO SUL)
+BRAZIL 4 H BEHIND UTC CENTRAL (MANAUS)
+BRAZIL 3 H BEHIND UTC COASTAL STATES, RIO, SP, BRASILIA
+BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS.
+BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS
+BULGARIA 2 H AHEAD OF UTC WINTER
+BULGARIA 3 H AHEAD OF UTC SUMMER MAR31 - SEP 85, 0100 LOCAL
+CHINA 8 H AHEAD OF UTC; ALL OF CHINA, INCL TAIWAN
+CUBA 5 H BEHIND UTC IN WINTER
+CUBA 4 H BEHIND UTC MAY 8 - OCT 8
+CYPRUS 2 H AHEAD UTC IN WINTER
+CYPRUS 3 H AHEAD UTC MAR 25 - SEP 30
+DENMARK 1 H AHEAD UTC IN WINTER
+DENMARK 2 H AHEAD UTC MAR 31 - SEP 30 , 0200 LOCAL
+DENMK. FAEROE IS 1 H AHEAD UTC MAR 31 - SEP 30 , 0200 LOCAL
+EGYPT 2 H AHEAD UTC
+EGYPT 3 H AHEAD UTC SUMMER (AFTER RAMADAN)
+ENGLAND ON UTC IN WINTER; WALES, SCOTLAND, N.I., CH.IS.
+ENGLAND 1 H AHEAD OF UTC; SUMMER TIL 28 OCT 0200 LOCAL
+FINLAND 2 H AHEAD OF UTC IN WINTER
+FINLAND 3 H AHEAD OF UTC MAR 25 - SEP 30
+FRANCE 1 H AHEAD OF UTC IN WINTER
+FRANCE 2 H AHEAD OF UTC MAR 31 - SEP 30 , 0100 LOCAL
+GREECE 2 H AHEAD OF UTC IN WINTER
+GREECE 3 H AHEAD OF UTC IN SUMMER EFF. 31MAR85 02/03 LOCAL
+GREECE 3 H AHEAD OF UTC MAR 25 - SEP 30
+GREENLAND 4 H BEHIND UTC IN THULE AIRBASE YEAR ROUND
+GREENLAND 3 H BEHIND UTC IN WINTER AT SONDRESTROM
+GREENLAND 2 H BEHIND UTC 30 MAR - 30 SEP 2200 LOCAL AT -"-
+GREENLAND 2 H BEHIND UTC AROUND SCORESBY SUND
+ICELAND ON UTC
+IRAN 3.5H AHEAD OF UTC
+IRELAND ON UTC IN WINTER
+IRELAND 1 H AHEAD OF UTC MAR 31 - OCT 23 0200 LOCAL
+ITALY 1 H AHEAD OF UTC IN WINTER
+ITALY 2 H AHEAD OF UTC MAR 31 - SEP 30, 0030 LOCAL
+JAMAICA 5 H BEHIND UTC IN WINTER
+JAMAICA 4 H BEHIND UTC APR 29 - OCT 29
+LIBYA 2 H AHEAD OF UTC
+MEXICO BAJA CAL N 8 H BEHIND UTC IN WINTER; NORTH BAJA CAL, TIJUANA
+MEXICO BAJA CAL N 7 H BEHIND UTC APR 29 - OCT 29
+MEXICO BAJA CAL S 7 H BEHIND UTC ALL YEAR; MAZATLAN
+MEXICO CENTRAL 6 H BEHIND UTC ALL YEAR; MEXICO CITY
+MONACO 1 H AHEAD UTC IN WINTER
+MONACO 2 H AHEAD UTC MAR 25 - SEP30
+PARAGUAY 4 H BEHIND UTC IN WINTER
+PARAGUAY 3 H BEHIND UTC SEP 30 - MAR 30
+POLAND 1 H AHEAD OF UTC IN WINTER
+POLAND 2 H AHEAD OF UTC MAR 24 - SEP 0200 LOCAL
+PORTUGAL ON UTC IN WINTER
+PORTUGAL 1 H AHEAD OF UTC IN SUMMER MAR 31 - SEP 29 0100 LOCAL
+PORTUGAL AZORES 1 H BEHIND UTC IN WINTER
+PORTUGAL AZORES ON UTC IN SUMMER MAR 31 - SEP 29
+PORTUGAL MADEIRA ON UTC ALL YEAR;
+ROMANIA 2 H AHEAD OF UTC IN WINTER
+ROMANIA 3 H AHEAD OF UTC APR 3 - SEP 24
+SCOTLAND SEE ENGLAND
+SWITZERLAND 1 H AHEAD OF UTC IN WINTER
+SWITZERLAND 2 H AHEAD OF UTC MAR 31 - SEP 30 0200 LOCAL
+TURKEY 3 H AHEAD OF UTC
+USA EASTERN 5 H BEHIND UTC IN WINTER; NEW YORK, WASHINGTON
+USA EASTERN 4 H BEHIND UTC APR 29 - OCT 29
+USA CENTRAL 6 H BEHIND UTC IN WINTER; CHICAGO, HOUSTON
+USA CENTRAL 5 H BEHIND UTC APR 29 - OCT 29
+USA MOUNTAIN 7 H BEHIND UTC IN WINTER; DENVER
+USA MOUNTAIN 6 H BEHIND UTC APR 29 - OCT 29
+USA PACIFIC 8 H BEHIND UTC IN WINTER; L.A., SAN FRANCISCO
+USA PACIFIC 7 H BEHIND UTC APR 29 - OCT 29
+USA ALASKA STD 9 H BEHIND UTC IN WINTER; MOST OF ALASKA (AKST)
+USA ALASKA STD 8 H BEHIND UTC APR 29 - OCT 29 (AKDT)
+USA ALEUTIAN 10 H BEHIND UTC IN WINTER; ISLANDS WEST OF 170W
+USA - " - 9 H BEHIND UTC APR 29 - OCT 29
+USA HAWAII 10 H BEHIND UTC ALL YEAR;
+USA BERING 11 H BEHIND UTC ALL YEAR; SAMOA, MIDWAY
+USSR WEST EUROP 3 H AHEAD OF UTC IN WINTER; LENINGRAD, MOSCOW
+USSR WEST EUROP 4 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL EUR 4 H AHEAD OF UTC IN WINTER; ROSTOV, BAKU
+USSR CENTRAL EUR 5 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST EUROP 5 H AHEAD OF UTC IN WINTER; SVERDLOVSK
+USSR EAST EUROP 6 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST SIBERIAN 6 H AHEAD OF UTC IN WINTER; TASHKENT, ALMA ATA
+USSR WEST SIBERIAN 7 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST-CENTRAL 7 H AHEAD OF UTC IN WINTER; NOVOSIBIRSK
+USSR WEST-CENTRAL 8 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST-CENTRAL 8 H AHEAD OF UTC IN WINTER; IRKUTSK
+USSR WEST-CENTRAL 9 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL SIB 9 H AHEAD OF UTC IN WINTER; YAKUTSK
+USSR CENTRAL SIB 10 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL SIB 10 H AHEAD OF UTC IN WINTER; VLADIVOSTOK
+USSR CENTRAL SIB 11 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA 11 H AHEAD OF UTC IN WINTER; MAGADAN
+USSR EAST SIBERIA 12 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA 12 H AHEAD OF UTC IN WINTER; PETROPAVLOVSK
+USSR EAST SIBERIA 13 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA 13 H AHEAD OF UTC IN WINTER; UELEN
+USSR EAST SIBERIA 14 H AHEAD OF UTC APR 1 - SEP 30
+WALES SEE ENGLAND
diff --git a/share/zoneinfo/datfiles/usno1989 b/share/zoneinfo/datfiles/usno1989
new file mode 100644
index 0000000..82cc386
--- /dev/null
+++ b/share/zoneinfo/datfiles/usno1989
@@ -0,0 +1,452 @@
+# @(#)usno1989 1.3
+#
+# From Arthur David Olson (January 19, 1989):
+#
+# Here's time zone information from the United States Naval Observatory;
+# no corrections have been made, and there are some obvious challenges.
+# The USNO warns:
+# DUE TO FREQUENT CHANGES IN THE LOCAL LAWS GOVERNING DAYLIGHT
+# SAVING TIME, WE CANNOT GUARANTEE THE ACCURACY OF THIS
+# INFORMATION. PLEASE ALERT US TO ANY DISCREPANCY YOU MAY
+# DISCOVER.
+#
+AFGHANISTAN 4.5H AHEAD OF UTC
+ALBANIA 1 H AHEAD OF UTC
+ALBANIA 2 H AHEAD OF UTC MAR 27 - SEP 24
+ALBANIA (ESTIMATED)
+ALGERIA 1 H AHEAD OF UTC
+AMERICAN SAMOA 11 H BEHIND UTC
+ANDORRA 1 H AHEAD OF UTC
+ANDORRA 2 H AHEAD OF UTC MAR 27 - SEP 24
+ANDORRA (ESTIMATED)
+ANGOLA 1 H AHEAD OF UTC
+ARGENTINA 3 H BEHIND UTC
+ARUBA 4 H BEHIND UTC ALSO BONAIRE, CURACAO,
+ARUBA ST.MAARTEN
+AUSTRALIA WEST 8 H AHEAD OF UTC PERTH, EXMOUTH
+AUSTRALIA N.T. 9.5H AHEAD OF UTC DARWIN NO ADVANCED TIME
+AUSTRALIA N.T. IN SUMMER
+AUSTRALIA SOUTH 9.5H AHEAD OF UTC ADELAIDE
+AUSTRALIA INCLUDING BROKEN HILL, NSW
+AUSTRALIA SOUTH 10.5H AHEAD OF UTC ADELAIDE OCT 30, '88-MAR
+AUSTRALIA SOUTH 18, '89 INCLUDING BROKEN
+AUSTRIALIA SOUTH HILL, NSW
+AUSTRALIA QUEENL 10 H AHEAD OF UTC
+AUSTRALIA NSW 10 H AHEAD OF UTC SYDNEY
+AUSTRALIA NSW 11 H AHEAD OF UTC SYDNEY OCT 30, '88-MAR 18,
+AUSTRALIA NSW '89
+AUSTRALIA TASM. 10 H AHEAD OF UTC HOBART
+AUSTRALIA TASM. 11 H AHEAD OF UTC HOBART OCT 30, '88-MAR 18,
+AUSTRALIA TASM. '89
+AUSTRIA 1 H AHEAD OF UTC
+AUSTRIA 2 H AHEAD OF UTC MAR 27 - SEPT 24
+AZORES SEE PORTUGAL
+BAHAMAS 5 H BEHIND UTC EXCLUDING TURKS AND CAICOS
+BAHAMAS ISLANDS)
+BAHAMAS 4 H BEHIND UTC APR 3 - OCT 29 (SAME
+BAHAMAS EXCLUSION)
+BAHRAIN 3 H AHEAD OF UTC
+BANGLADESH 6 H AHEAD OF UTC
+BARBADOS 4 H BEHIND UTC
+BELGIUM 1 H AHEAD OF UTC
+BELGIUM 2 H AHEAD OF UTC MAR 27 - SEP 24
+BELIZE 6 H BEHIND UTC
+BENIN PEOPLES REP 1 H AHEAD OF UTC DAHOMEY
+BERMUDA 4 H BEHIND UTC
+BERMUDA 3 H BEHIND UTC APR 3 - OCT 29
+BHUTAN 6 H AHEAD OF UTC
+BOLIVIA 4 H BEHIND UTC
+BONAIRE 4 H BEHIND UTC ALSO ARUBA,CURACAO,
+BONAIRE ST.MAARTEN, SABA
+BOTSWANA 2 H AHEAD OF UTC
+BRAZIL WEST 5 H BEHIND UTC TERRITORY OF ACRE
+BRAZIL WEST 4 H BEHIND UTC ACRE OCT 23, '88-FEB 11,
+BRAZIL '89 (ESTIMATED)
+BRAZIL CENTRAL 4 H BEHIND UTC MANAUS
+BRAZIL CENTRAL 3 H BEHIND UTC MANAUS OCT 23, '88-FEB 11,
+BRAZIL CENTRAL '89 (ESTIMATED)
+BRAZIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SAO
+BRAZIL EAST PAULO, BRASILIA
+BRAZIL EAST 2 H BEHIND UTC COASTAL STATES, RIO, SAO
+BRAZIL PAULO, BRASILIA OCT 23,
+BRAZIL '88-FEB 11, '89
+BRAZIL (ESTIMATED)
+BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS, FERNANDO
+BRAZIL DE NORONHA
+BRAZIL 1 H BEHIND UTC OCT 23, '88-FEB 11, '89
+BRAZIL (ESTIMATED)
+BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS.
+BRITISH VIRGIN I. 4 H BEHIND UTC
+BRUNEI 8 H AHEAD OF UTC
+BULGARIA 2 H AHEAD OF UTC
+BULGARIA 3 H AHEAD OF UTC MAR 27 - SEP 24
+BURKINA FASO ON UTC
+BURMA 6.5H AHEAD OF UTC
+BURUNDI 2 H AHEAD OF UTC
+CAMBODIA SEE KAMPUCHEA
+CAMEROON 1 H AHEAD OF UTC
+CANADA NEW FDL 3.5H BEHIND UTC ST.JOHN'S
+CANADA NEW FDL 1.5H BEHIND UTC APR 3 - OCT 29
+CANADA ATLANTIC 4 H BEHIND UTC HALIFAX
+CANADA ATLANTIC 3 H BEHIND UTC APR 3 - OCT 29
+CANADA EASTERN 5 H BEHIND UTC TORONTO, MONTREAL, OTTAWA
+CANADA EASTERN 4 H BEHIND UTC APR 3 - OCT 29
+CANADA CENTRAL 6 H BEHIND UTC REGINA, WINNIPEG
+CANADA CENTRAL 5 H BEHIND UTC APR 3 - OCT 29
+CANADA MOUNTAIN 7 H BEHIND UTC CALGARY, EDMONTON
+CANADA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 29
+CANADA PACIFIC 8 H BEHIND UTC VANCOUVER
+CANADA PACIFIC 7 H BEHIND UTC APR 3 - OCT 29
+CANADA YUKON SAME AS PACIFIC DAWSON
+CAPE VERDE 1 H BEHIND UTC
+CAYMAN ISLANDS 5 H BEHIND UTC
+CAROLINE ISLAND 10 H AHEAD OF UTC EXCLUDING PONAPE IS.,
+CAROLINE ISLAND KUSAIE, AND PINGELAP
+CENTRAL AFRICA 1 H AHEAD OF UTC
+CEYLON 5.5H AHEAD OF UTC, SEE SRI LANKA
+CHAD 1 H AHEAD OF UTC
+CHANNEL ISLANDS SEE ENGLAND
+CHILE 4 H BEHIND UTC CONTINENTAL
+CHILE 3 H BEHIND UTC OCT 9, '88-MAR 11, '89
+CHILE 6 H BEHIND UTC EASTER ISLAND
+CHILE 5 H BEHIND UTC OCT 9, '88-MAR 11, '89
+CHINA 8 H AHEAD OF UTC ALL OF CHINA, INCL TAIWAN
+CHINA 9 H AHEAD OF UTC APR 17 - SEP 10
+COCOS (Keeling) I. 6.5H AHEAD OF UTC
+COLOMBIA 5 H BEHIND UTC
+COMOROS 3 H AHEAD OF UTC
+CONGO 1 H AHEAD OF UTC
+COOK ISLANDS 10 H BEHIND UTC
+COOK ISLANDS 9.5H BEHIND UTC OCT 30, '88-MAR 24, '89
+COOK ISLANDS (ESTIMATED)
+COSTA RICA 6 H BEHIND UTC
+COTE D'IVOIRE ON UTC
+CUBA 5 H BEHIND UTC
+CUBA 4 H BEHIND UTC MAR 20 - OCT 8
+CURACAO 4 H BEHIND UTC ALSO BONAIRE, ARUBA,
+CURACAO ST.MAARTEN
+CYPRUS 2 H AHEAD OF UTC
+CYPRUS 3 H AHEAD OF UTC MAR 27 - SEP 24
+CZECHOSLOVAKIA 1 H AHEAD OF UTC
+CZECHOSLOVAKIA 2 H AHEAD OF UTC MAR 27 - SEP 24
+DENMARK 1 H AHEAD OF UTC
+DENMARK 2 H AHEAD OF UTC MAR 27 - SEP 24
+DENMK. FAEROE IS 1 H AHEAD OF UTC MAR 27 - SEP 24
+DJIBOUTI 3 H AHEAD OF UTC
+DOMINICA 4 H BEHIND UTC
+DOMINICAN REP 4 H BEHIND UTC
+ECUADOR 5 H BEHIND UTC CONTINENTAL
+ECUADOR 6 H BEHIND UTC GALAPAGOS ISLANDS
+EGYPT 2 H AHEAD OF UTC
+EGYPT 3 H AHEAD OF UTC MAY 17 - SEP 30 (AFTER
+EGYPT RAMADAN)
+EL SALVADOR 6 H BEHIND UTC
+ENGLAND ON UTC (WALES, SCOTLAND, N.I.,
+ENGLAND CH. IS.)
+ENGLAND 1 H AHEAD OF UTC MAR 27 - OCT 22
+ENEZUELA 4 H BEHIND UTC
+EQUITORIAL GUINEA 1 H AHEAD OF UTC
+ETHIOPIA 3 H AHEAD OF UTC
+FALKLAND ISLANDS 4 H BEHIND UTC
+FALKLAND ISLANDS 3 H BEHIND UTC SEP 11, '88-APR 15, '89
+FALKLAND ISLANDS (ESTIMATED)
+FAROE ISLAND ON UTC
+FAROE ISLAND 1 H AHEAD OF UTC MAR 27 - SEP 24
+FIJI 12 H AHEAD OF UTC
+FINLAND 2 H AHEAD OF UTC
+FINLAND 3 H AHEAD OF UTC MAR 27 - SEP 24
+FRANCE 1 H AHEAD OF UTC
+FRANCE 2 H AHEAD OF UTC MAR 27 - SEP 24
+FRENCH GUIANA 3 H BEHIND UTC
+FRENCH POLYNESIA 9 H BEHIND UTC GAMBIER ISLAND
+FRENCH POLYNESIA 9.5H BEHIND UTC MARQUESAS ISLANDS
+FRENCH POLYNESIA 10 H BEHIND UTC SOCIETY ISLANDS, TUBUAI
+FRENCH POLYNESIA ISLANDS, TUAMOTU ISLAND,
+FRENCH POLYNESIA TAHITI
+GABON 1 H AHEAD OF UTC
+GAMBIA ON UTC
+GERMANY ALL 1 H AHEAD OF UTC
+GERMANY ALL 2 H AHEAD OF UTC MAR 27 - SEP 24
+GHANA ON UTC
+GIBRALTAR 1 H AHEAD OF UTC
+GIBRALTAR 2 H AHEAD OF UTC MAR 27 - SEP 24
+GREECE 2 H AHEAD OF UTC
+GREECE 3 H AHEAD OF UTC MAR 27 - SEP 24
+GREENLAND 4 H BEHIND UTC THULE AIRBASE YEAR ROUND
+GREENLAND 3 H BEHIND UTC ANGMAGSSALIK AND W. COAST
+GREENLAND 2 H BEHIND UTC MAR 27 - SEP 24
+GREENLAND 1 H BEHIND UTC SCORESBYSUND
+GREENLAND ON UTC MAR 27 - SEP 24
+GRENADA 4 H BEHIND UTC
+GUADELOUPE 4 H BEHIND UTC ST. BARTHELEMY, NORTHERN
+GUADELOUPE ST. MARTIN MARTINIQUE
+GUAM 10 H AHEAD OF UTC
+GUATEMALA 6 H BEHIND UTC
+GUINEA ON UTC
+GUINEA BISSAU ON UTC
+GUINEA REPUBLIC ON UTC
+GUINEA EQUATORIAL 1 H AHEAD OF UTC
+GUYANA 3 H BEHIND UTC
+HAITI 5 H BEHIND UTC
+HAITI 4 H BEHIND UTC APR 3 - OCT 29
+HOLLAND SEE NETHERLANDS
+HONDURAS 6 H BEHIND UTC
+HONG KONG 8 H AHEAD OF UTC
+HUNGARY 1 H AHEAD OF UTC
+HUNGARY 2 H AHEAD OF UTC MAR 27 - SEP 24
+ICELAND ON UTC
+INDIA 5.5H AHEAD OF UTC INCLUDING ANDAMAN ISLANDS
+INDONESIA WEST 7 H AHEAD OF UTC SUMATRA, JAVA, BALI,
+INDONESIA WEST JAKARTA
+INDONESIA CENTRAL 8 H AHEAD OF UTC KALIMANTAN, SULAWESI
+INDONESIA EAST 9 H AHEAD OF UTC IRIAN, BARAT
+IRAN 3.5H AHEAD OF UTC
+IRAQ 3 H AHEAD OF UTC
+IRAQ 4 H AHEAD OF UTC APR 1 - SEP 30
+IRELAND ON UTC
+IRELAND 1 H AHEAD OF UTC MAR 27 - OCT 22
+ISRAEL 2 H AHEAD OF UTC
+ISRAEL 3 H AHEAD OF UTC APR 10 - SEP 3
+ITALY 1 H AHEAD OF UTC
+ITALY 2 H AHEAD OF UTC MAR 27 - SEP 24
+IVORY COAST ON UTC
+IWAN 8 H AHEAD OF UTC
+JAMAICA 5 H BEHIND UTC
+JAPAN 9 H AHEAD OF UTC
+JOHNSTON ISLAND 10 H BEHIND UTC
+JORDAN 2 H AHEAD OF UTC
+JORDAN 3 H AHEAD OF UTC APR 1 - OCT 6
+KAMPUCHEA 7 H AHEAD OF UTC
+KENYA 3 H AHEAD OF UTC
+KIRIBATI, REP OF 12 H AHEAD OF UTC CANTON, ENDERBURY ISLANDS
+KIRIBATI, REP OF 11 H AHEAD OF UTC CHRISTMAS ISLAND
+KOREA 9 H AHEAD OF UTC
+KOREA, REP OF 9 H AHEAD OF UTC
+KOREA, REP OF 10 H AHEAD OF UTC MAY 8 - OCT 8
+KUWAIT 3 H AHEAD OF UTC
+KUSAIE, PINGELAP 12 H AHEAD OF UTC INCLUDING MARSHALL IS.,
+KUSAIE, PINGELAP EXCLUDING KWAJALEIN)
+KWAJALEIN 12 H BEHIND UTC
+LAOS 7 H AHEAD OF UTC
+LEBANON 2 H AHEAD OF UTC
+LEBANON 3 H AHEAD OF UTC JUN 1 - OCT 31
+LEEWARD ISLANDS 4 H BEHIND UTC ANTIGUA, DOMINICA,
+LEEWARD ISLANDS MONTSERRAT, ST.
+LEEWARD ISLAANDS CHRISTOPHER, ST. KITTS,
+LEEWARD ISLANDS NEVIS, ANGUILLA
+LESOTHO 2 H AHEAD OF UTC
+LIBERIA ON UTC
+LIBYAN ARAB 1 H AHEAD OF UTC JAMAHIRIYA/LIBYA
+LIBYAN ARAB 2 H AHEAD OF UTC APR 1 - SEP 30 JAMAHIRIYA/LIBYA
+LIECHTENSTEIN 1 H AHEAD OF UTC
+LIECHTENSTEIN 2 H AHEAD OF UTC MAR 27 - SEP 24
+LUXEMBOURG 1 H AHEAD OF UTC
+LUXEMBOURG 2 H AHEAD OF UTC MAR 27 - SEP 24
+MACAO 8 H AHEAD OF UTC
+MADAGASCAR 3 H AHEAD OF UTC
+MADEIRA SEE PORTUGAL
+MALAWI 2 H AHEAD OF UTC
+MALAYSIA 8 H AHEAD OF UTC
+MALDIVES 5 H AHEAD OF UTC
+MALI ON UTC
+MALTA 1 H AHEAD OF UTC
+MALTA 2 H AHEAD OF UTC MAR 27 - SEP 24
+MARTINIQUE 4 H BEHIND UTC
+MAURITANIA ON UTC
+MAURITIUS 4 H AHEAD OF UTC
+MARIANA ISLAND 10 H AHEAD OF UTC EXCLUDING GUAM
+MEXICO BAJA CAL N 7 H BEHIND UTC BAJA CALIFORNIA SUR AND
+MEXICO BAJA CAL N N. PACIFIC COAST (STATES
+MEXICO BAJA CAL N OF SINALOA AND SONORA)
+MEXICO BAJA CAL N 8 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
+MEXICO BAJA CAL N - OCT 29
+MEXICO BAJA CAL N 7 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
+MEXICO BAJA CAL N - 0CT 29
+MEXICO 6 H BEHIND UTC STATES OF DURANGO,
+MEXICO COAHUILA, NUEVO LEON,
+MEXICO TAMAULIPAS
+MEXICO 5 H BEHIND UTC STATES OF DURANGO,
+MEXICO COAHUILA, NUEVO LEON,
+MEXICO TAMAULIPAS APR 3 - OCT 29
+MEXICO 6 H BEHIND UTC GENERAL MEXICO, STATES OF
+MEXICO CAMPECHE, QUINTANA ROO AND
+MEXICO YUCATAN
+MIDWAY ISLAND 11 H BEHIND UTC
+MONACO 1 H AHEAD OF UTC
+MONACO 2 H AHEAD OF UTC MAR 27 - SEP 24
+MONGOLIA 8 H AHEAD OF UTC
+MONGOLIA 9 H AHEAD OF UTC MAR 27 - SEP 24
+MONTSERRAT 4 H BEHIND UTC
+MOROCCO ON UTC
+MOZAMBIQUE 2 H AHEAD OF UTC
+NAMIBIA 2 H AHEAD OF UTC
+NAURU, REP OF 12 H AHEAD OF UTC
+NEPAL 5H45M AHEAD OF UTC
+NETHERLANDS 1 H AHEAD OF UTC
+NETHERLANDS 2 H AHEAD OF UTC MAR 27 - SEP 24
+NETHERLANDS 4 H BEHIND UTC ANTILLES AND SOUTHERN ST.
+NETHERLANDS MAARTEN
+NEW CALEDONIA 11 H AHEAD OF UTC
+NEW HEBRIDES SEE VANUATU
+NEW ZEALAND 12 H AHEAD OF UTC (EXCLUDING CHATHAM ISLAND)
+NEW ZEALAND 13 H AHEAD OF UTC OCT 30, '88-MAR 4, '89
+NEW ZEALAND 12H45M AHEAD OF UTC CHATHAM ISLAND
+NICARAGUA 6 H BEHIND UTC
+NIGER 1 H AHEAD OF UTC
+NIGERIA 1 H AHEAD OF UTC
+NIUE ISLAND 11 H BEHIND UTC
+NORFOLK ISLAND 11H30M AHEAD OF UTC
+NORTHERN IRELAND ON UTC WALES, SCOTLAND, N.I.,
+NORTHERN IRELAND CH.IS.
+NORTHERN IRELAND 1 H AHEAD OF UTC MAR 27 - OCT 22
+NORWAY 1 H AHEAD OF UTC
+NORWAY 2 H AHEAD OF UTC MAR 27 - SEP 24
+OGO ON UTC
+OMAN 4 H AHEAD OF UTC
+PACIFIC ISLAND T.T.
+PALAU ISLAND 9 H AHEAD OF UTC
+PAKISTAN 5 H AHEAD OF UTC
+PANAMA 5 H BEHIND UTC
+PAPUA NEW GUINEA 10 H AHEAD OF UTC INCLUDING BOUGAINVILLE
+PAPUA NEW GUINEA ISLAND
+PARAGUAY 4 H BEHIND UTC
+PARAGUAY 3 H BEHIND UTC OCT 1, '88-MAR 31, '89
+PERU 5 H BEHIND UTC
+PHILIPPINES 8 H AHEAD OF UTC
+PONAPE ISLAND 11 H AHEAD OF UTC
+POLAND 1 H AHEAD OF UTC
+POLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
+PORTUGAL MAINLAND ON UTC
+PORTUGAL MAINLAND 1 H AHEAD OF UTC MAR 27 - SEP 24
+PORTUGAL AZORES 1 H BEHIND UTC
+PORTUGAL AZORES ON UTC MAR 27 - SEP 24
+PORTUGAL MADEIRA ON UTC
+PORTUGAL MADEIRA 1 H AHEAD OF UTC MAR 27 - SEP 24
+PUERTO RICO 4 H BEHIND UTC
+QATAR 3 H AHEAD OF UTC
+ROMANIA 2 H AHEAD OF UTC
+ROMANIA 3 H AHEAD OF UTC MAR 27 - SEP 24
+RUSSIA SEE USSR
+RWANDA 2 H AHEAD OF UTC
+SABA 4 H BEHIND UTC ALSO BONAIRE, CURACAO,
+SAMOA 11 H BEHIND UTC
+SAN MARINO 1 H AHEAD OF UTC
+SAN MARINO 2 H AHEAD OF UTC MAR 27 - SEP 24
+SAN SALVADOR 6 H BEHIND UTC
+SAO TOME ISLAND ON UTC AND PRINCIPE ISLAND
+SAUDI ARABIA 3 H AHEAD OF UTC
+SCOTLAND SEE ENGLAND
+SENEGAL ON UTC
+SEYCHELLES 4 H AHEAD OF UTC
+SIERRA LEONE ON UTC
+SINGAPORE 8 H AHEAD OF UTC
+SOLOMON ISLANDS 11 H AHEAD OF UTC EXCLUDING BOUGAINVILLE
+SOLOMON ISLANDS ISLAND
+SOMALI 3 H AHEAD OF UTC
+SOUTH AFRICA 2 H AHEAD OF UTC
+SPAIN CANARY IS ON UTC
+SPAIN CANARY IS 1 H AHEAD OF UTC MAR 27 - SEP 24
+SPAIN 1 H AHEAD OF UTC CONTINENTAL, BALEARIC AND
+SPAIN MALLORCA ISLANDS
+SPAIN 2 H AHEAD OF UTC CONTINENTAL, BALEARIC AND
+SPAIN MALLORCA ISLANDS MAR 27 -
+SPAIN SEP 24
+SPAIN MAINLAND 1 H AHEAD OF UTC MELILLA
+SPAIN MAINLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
+SRI LANKA 5H30M AHEAD OF UTC
+ST.MAARTEN
+ST.KITTS-NEVIS 4 H BEHIND UTC
+ST.LUCIA 4 H BEHIND UTC
+ST.PIERRE 3 H BEHIND UTC INCLUDING MIQUELON
+ST.PIERRE 2 H BEHIND UTC INLCUDING MIQUELON APR 3
+ST.PIERRE - OCT 29
+ST.VINCENT 4 H BEHIND UTC INCLUDING THE GRENADINES
+ST. HELENA ON UTC
+SURINAME 3 H BEHIND UTC
+SWAZILAND 2 H AHEAD OF UTC
+SWEDEN 1 H AHEAD OF UTC
+SWEDEN 2 H AHEAD OF UTC MAR 27 - SEP 24
+SWITZERLAND 1 H AHEAD OF UTC
+SWITZERLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
+SYRIA 2 H AHEAD OF UTC
+SYRIA 3 H AHEAD OF UTC MAR 15 - OCT 30
+TAHITI 10 H BEHIND UTC
+TANZANIA 3 H AHEAD OF UTC
+THAILAND 7 H AHEAD OF UTC
+TRINIDAD / TOBAGO 4 H BEHIND UTC
+TUNISIA 1 H AHEAD OF UTC
+TUNISIA 2 H AHEAD OF UTC APR 10 - SEP 24
+TURKEY 2 H AHEAD OF UTC
+TURKEY 3 H AHEAD OF UTC MAR 27 - SEP 24
+TURKS AND CAICOS 5 H BEHIND UTC
+TURKS AND CAICOS 4 H BEHIND UTC APR 3 - OCT 29
+TUVALU 12 H AHEAD OF UTC
+UDAN 2 H AHEAD OF UTC
+UGANDA 3 H AHEAD OF UTC
+UNITED ARAB EMIR. 4 H AHEAD OF UTC ABU DHABI, DUBAI, SHARJAH,
+UNITED ARAB EMIR RAS AL KHAIMAH
+UNITED KINGDOM ON UTC WALES, SCOTLAND, N.I., CH.
+UNITED KINGDOM IS.
+UNITED KINGDOM 1 H AHEAD OF UTC MAR 27 - OCT 22
+UNITED STATES SEE USA
+UPPER VOLTA ON UTC
+URUGUAY 3 H BEHIND UTC
+URUGUAY 2 H BEHIND UTC DEC 11, '88-FEB 25, '89
+URAGUAY (ESTIMATED)
+USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
+USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
+USA CENTRAL 6 H BEHIND UTC CHICAGO, HOUSTON
+USA CENTRAL 5 H BEHIND UTC APR 3 - OCT 30
+USA MOUNTAIN 7 H BEHIND UTC DENVER
+USA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 30
+USA PACIFIC 8 H BEHIND UTC L.A., SAN FRANCISCO
+USA PACIFIC 7 H BEHIND UTC APR 3 - OCT 30
+USA ALASKA STD 9 H BEHIND UTC MOST OF ALASKA (AKST)
+USA ALASKA STD 8 H BEHIND UTC APR 3 - OCT 30 (AKDT)
+USA ALEUTIAN 10 H BEHIND UTC ISLANDS WEST OF 170W
+USA - " - 9 H BEHIND UTC APR 3 - OCT 30
+USA HAWAII 10 H BEHIND UTC
+USA BERING 11 H BEHIND UTC SAMOA, MIDWAY
+USA FOR SPECIFIC INFO ON USA ZONES/TIMES CALL DOT 202-426-4520
+USSR WEST EUROP 3 H AHEAD OF UTC LENINGRAD, MOSCOW
+USSR WEST EUROP 4 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL EUR 4 H AHEAD OF UTC ROSTOV, BAKU
+USSR CENTRAL EUR 5 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST EUROP 5 H AHEAD OF UTC SVERDLOVSK
+USSR EAST EUROP 6 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST SIBERIAN 6 H AHEAD OF UTC TASHKENT, ALMA ATA
+USSR WEST SIBERIAN 7 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST-CENTRAL 7 H AHEAD OF UTC NOVOSIBIRSK
+USSR WEST-CENTRAL 8 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST-CENTRAL 8 H AHEAD OF UTC IRKUTSK
+USSR WEST-CENTRAL 9 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL SIB 9 H AHEAD OF UTC YAKUTSK
+USSR CENTRAL SIB 10 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL SIB 10 H AHEAD OF UTC VLADIVOSTOK
+USSR CENTRAL SIB 11 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA 11 H AHEAD OF UTC MAGADAN
+USSR EAST SIBERIA 12 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA 12 H AHEAD OF UTC PETROPAVLOVSK
+USSR EAST SIBERIA 13 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA 13 H AHEAD OF UTC UELEN
+USSR EAST SIBERIA 14 H AHEAD OF UTC APR 1 - SEP 30
+VANUATU 11 H AHEAD OF UTC (NEW HEBRIDES)
+VANUATU 12 H AHEAD OF UTC SEP 25, '88-MAR 25, '89
+VANUATU (ESTIMATED)
+VATICAN 1 H AHEAD OF UTC
+VATICAN 2 H AHEAD OF UTC MAR 27 - SEP 24
+VIETNAM 7 H AHEAD OF UTC
+VIRGIN ISLANDS 4 H BEHIND UTC ST.CROIX, ST.THOMAS,
+VIRGIN ISLANDS ST.JOHN
+WAKE ISLAND 12 H AHEAD OF UTC
+WALES SEE ENGLAND
+WALLIS/FUTUNA IS. 12 H AHEAD OF UTC
+WINDWARD ISLANDS 4 H BEHIND UTC GRENADA, ST. LUCIA
+YEMEN 3 H AHEAD OF UTC BOTH REPUBLICS
+YUGOSLAVIA 1 H AHEAD OF UTC
+YUGOSLAVIA 2 H AHEAD OF UTC MAR 27 - SEP 24
+ZAIRE EAST 1 H AHEAD OF UTC KINSHASA MBANDAKA
+ZAIRE WEST 2 H AHEAD OF UTC LUBUMBASHI, KASAI, KIVU,
+ZAIRE WEST HAUT-ZAIRE, SHABA
+ZAMBIA 2 H AHEAD OF UTC
+ZIMBABWE 2 H AHEAD OF UTC
diff --git a/share/zoneinfo/ialloc.c b/share/zoneinfo/ialloc.c
new file mode 100644
index 0000000..118a97b
--- /dev/null
+++ b/share/zoneinfo/ialloc.c
@@ -0,0 +1,140 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Arthur David Olson of the National Cancer Institute.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)ialloc.c 8.1 (Berkeley) 6/8/93";
+#endif /* not lint */
+
+#ifdef notdef
+static char elsieid[] = "@(#)ialloc.c 8.18";
+#endif
+
+/*LINTLIBRARY*/
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef MAL
+#define NULLMAL(x) ((x) == NULL || (x) == MAL)
+#else /* !defined MAL */
+#define NULLMAL(x) ((x) == NULL)
+#endif /* !defined MAL */
+
+#define nonzero(n) (((n) == 0) ? 1 : (n))
+
+char * icalloc __P((int nelem, int elsize));
+char * icatalloc __P((char * old, const char * new));
+char * icpyalloc __P((const char * string));
+char * imalloc __P((int n));
+char * irealloc __P((char * pointer, int size));
+void ifree __P((char * pointer));
+
+char *
+imalloc(n)
+const int n;
+{
+#ifdef MAL
+ register char * result;
+
+ result = malloc((size_t) nonzero(n));
+ return NULLMAL(result) ? NULL : result;
+#else /* !defined MAL */
+ return malloc((size_t) nonzero(n));
+#endif /* !defined MAL */
+}
+
+char *
+icalloc(nelem, elsize)
+int nelem;
+int elsize;
+{
+ if (nelem == 0 || elsize == 0)
+ nelem = elsize = 1;
+ return calloc((size_t) nelem, (size_t) elsize);
+}
+
+char *
+irealloc(pointer, size)
+char * const pointer;
+const int size;
+{
+ if (NULLMAL(pointer))
+ return imalloc(size);
+ return realloc((void *) pointer, (size_t) nonzero(size));
+}
+
+char *
+icatalloc(old, new)
+char * const old;
+const char * const new;
+{
+ register char * result;
+ register oldsize, newsize;
+
+ newsize = NULLMAL(new) ? 0 : strlen(new);
+ if (NULLMAL(old))
+ oldsize = 0;
+ else if (newsize == 0)
+ return old;
+ else oldsize = strlen(old);
+ if ((result = irealloc(old, oldsize + newsize + 1)) != NULL)
+ if (!NULLMAL(new))
+ (void) strcpy(result + oldsize, new);
+ return result;
+}
+
+char *
+icpyalloc(string)
+const char * const string;
+{
+ return icatalloc((char *) NULL, string);
+}
+
+void
+ifree(p)
+char * const p;
+{
+ if (!NULLMAL(p))
+ (void) free(p);
+}
+
+void
+icfree(p)
+char * const p;
+{
+ if (!NULLMAL(p))
+ (void) free(p);
+}
diff --git a/share/zoneinfo/scheck.c b/share/zoneinfo/scheck.c
new file mode 100644
index 0000000..44a7c3c
--- /dev/null
+++ b/share/zoneinfo/scheck.c
@@ -0,0 +1,99 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Arthur David Olson of the National Cancer Institute.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)scheck.c 8.1 (Berkeley) 6/8/93";
+#endif /* not lint */
+
+#ifdef notdef
+static char elsieid[] = "@(#)scheck.c 8.9";
+#endif
+
+/*LINTLIBRARY*/
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+char *
+scheck(string, format)
+const char * const string;
+const char * const format;
+{
+ register char * fbuf;
+ register const char * fp;
+ register char * tp;
+ register int c;
+ register char * result;
+ char dummy;
+
+ result = "";
+ if (string == NULL || format == NULL)
+ return result;
+ fbuf = malloc(2 * strlen(format) + 4);
+ if (fbuf == NULL)
+ return result;
+ fp = format;
+ tp = fbuf;
+ while ((*tp++ = c = *fp++) != '\0') {
+ if (c != '%')
+ continue;
+ if (*fp == '%') {
+ *tp++ = *fp++;
+ continue;
+ }
+ *tp++ = '*';
+ if (*fp == '*')
+ ++fp;
+ while (isascii(*fp) && isdigit(*fp))
+ *tp++ = *fp++;
+ if (*fp == 'l' || *fp == 'h')
+ *tp++ = *fp++;
+ else if (*fp == '[')
+ do *tp++ = *fp++;
+ while (*fp != '\0' && *fp != ']');
+ if ((*tp++ = *fp++) == '\0')
+ break;
+ }
+ *(tp - 1) = '%';
+ *tp++ = 'c';
+ *tp = '\0';
+ if (sscanf((char *)string, fbuf, &dummy) != 1)
+ result = (char *) format;
+ ifree(fbuf);
+ return result;
+}
diff --git a/share/zoneinfo/tzfile.5 b/share/zoneinfo/tzfile.5
new file mode 100644
index 0000000..07842cf
--- /dev/null
+++ b/share/zoneinfo/tzfile.5
@@ -0,0 +1,162 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Arthur David Olson of the National Cancer Institute.
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)tzfile.5 8.1 (Berkeley) 6/8/93
+.\"
+.Dd June 8, 1993
+.Dt TZFILE 5
+.Os
+.Sh NAME
+.Nm tzfile
+.Nd time zone information
+.Sh SYNOPSIS
+.Fd #include <tzfile.h>
+.Sh DESCRIPTION
+The time zone information files used by
+.Xr tzset 3
+begin with bytes reserved for future use,
+followed by four four-byte values of type
+.Em long ,
+written in a ``standard'' byte order
+(the high-order byte of the value is written first).
+These values are,
+in order:
+.Bl -tag -width tzh_ttisstdcnt
+.It Fa tzh_ttisstdcnt
+The number of standard/wall indicators stored in the file.
+.It Fa tzh_leapcnt
+The number of leap seconds for which data is stored in the file.
+.It Fa tzh_timecnt
+The number of "transition times" for which data is stored
+in the file.
+.It Fa tzh_typecnt
+The number of "local time types" for which data is stored
+in the file (must not be zero).
+.It Fa tzh_charcnt
+The number of characters of "time zone abbreviation strings"
+stored in the file.
+.El
+.Pp
+The above header is followed by
+.Fa tzh_timecnt
+four-byte values of type
+.Em long ,
+sorted in ascending order.
+These values are written in ``standard'' byte order.
+Each is used as a transition time (as returned by
+.Xr time 2 )
+at which the rules for computing local time change.
+Next come
+.Fa tzh_timecnt
+one-byte values of type
+.Fa unsigned char ;
+each one tells which of the different types of ``local time'' types
+described in the file is associated with the same-indexed transition time.
+These values serve as indices into an array of
+.Fa ttinfo
+structures that appears next in the file;
+these structures are defined as follows:
+.Bd -literal -offset indent
+struct ttinfo {
+ long tt_gmtoff;
+ int tt_isdst;
+ unsigned int tt_abbrind;
+};
+.Ed
+.Pp
+Each structure is written as a four-byte value for
+.Fa tt_gmtoff
+of type
+.Em long ,
+in a standard byte order, followed by a one-byte value for
+.Fa tt_isdst
+and a one-byte value for
+.Fa tt_abbrind .
+In each structure,
+.Fa tt_gmtoff
+gives the number of seconds to be added to
+.Tn GMT ,
+.Fa tt_isdst
+tells whether
+.Fa tm_isdst
+should be set by
+.Xr localtime 3
+and
+.Fa tt_abbrind
+serves as an index into the array of time zone abbreviation characters
+that follow the
+.Fa ttinfo
+structure(s) in the file.
+.Pp
+Then there are
+.Fa tzh_leapcnt
+pairs of four-byte values, written in standard byte order;
+the first value of each pair gives the time
+(as returned by
+.Xr time 2 )
+at which a leap second occurs;
+the second gives the
+.Em total
+number of leap seconds to be applied after the given time.
+The pairs of values are sorted in ascending order by time.
+.Pp
+Finally there are
+.Fa tzh_ttisstdcnt
+standard/wall indicators, each stored as a one-byte value;
+they tell whether the transition times associated with local time types
+were specified as standard time or wall clock time,
+and are used when a time zone file is used in handling
+.Tn POSIX Ns -style
+time zone environment variables.
+.Pp
+.Fa Localtime
+uses the first standard-time
+.Fa ttinfo
+structure in the file
+(or simply the first
+.Fa ttinfo
+structure in the absence of a standard-time structure)
+if either
+.Fa tzh_timecnt
+is zero or the time argument is less than the first transition time recorded
+in the file.
+.Sh SEE ALSO
+.Xr ctime 3
+.Sh HISTORY
+The
+.Nm tzfile
+file format appeared in
+.Bx 4.3 tahoe.
diff --git a/share/zoneinfo/zic.8 b/share/zoneinfo/zic.8
new file mode 100644
index 0000000..66191c0
--- /dev/null
+++ b/share/zoneinfo/zic.8
@@ -0,0 +1,424 @@
+.\" Copyright (c) 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Arthur David Olson of the National Cancer Institute.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)zic.8 8.1 (Berkeley) 6/8/93
+.\"
+.TH ZIC 8
+.SH NAME
+zic \- time zone compiler
+.SH SYNOPSIS
+.B zic
+[
+.B \-v
+] [
+.B \-d
+.I directory
+] [
+.B \-l
+.I localtime
+] [
+.B \-p
+.I posixrules
+] [
+.B \-L
+.I leapsecondfilename
+] [
+.B \-s
+] [
+.I filename
+\&... ]
+.SH DESCRIPTION
+.if t .ds lq ``
+.if t .ds rq ''
+.if n .ds lq \&"\"
+.if n .ds rq \&"\"
+.de q
+\\$3\*(lq\\$1\*(rq\\$2
+..
+.I Zic
+reads text from the file(s) named on the command line
+and creates the time conversion information files specified in this input.
+If a
+.I filename
+is
+.BR \- ,
+the standard input is read.
+.PP
+These options are available:
+.TP
+.BI "\-d " directory
+Create time conversion information files in the named directory rather than
+in the standard directory named below.
+.TP
+.BI "\-l " timezone
+Use the given time zone as local time.
+.I Zic
+will act as if the input contained a link line of the form
+.sp
+.ti +.5i
+Link \fItimezone\fP localtime
+.TP
+.BI "\-p " timezone
+Use the given time zone's rules when handling POSIX-format
+time zone environment variables.
+.I Zic
+will act as if the input contained a link line of the form
+.sp
+.ti +.5i
+Link \fItimezone\fP posixrules
+.TP
+.BI "\-L " leapsecondfilename
+Read leap second information from the file with the given name.
+If this option is not used,
+no leap second information appears in output files.
+.TP
+.B \-v
+Complain if a year that appears in a data file is outside the range
+of years representable by
+.IR time (2)
+values.
+.TP
+.B \-s
+Limit time values stored in output files to values that are the same
+whether they're taken to be signed or unsigned.
+You can use this option to generate SVVS-compatible files.
+.sp
+Input lines are made up of fields.
+Fields are separated from one another by any number of white space characters.
+Leading and trailing white space on input lines is ignored.
+An unquoted sharp character (#) in the input introduces a comment which extends
+to the end of the line the sharp character appears on.
+White space characters and sharp characters may be enclosed in double quotes
+(") if they're to be used as part of a field.
+Any line that is blank (after comment stripping) is ignored.
+Non-blank lines are expected to be of one of three types:
+rule lines, zone lines, and link lines.
+.PP
+A rule line has the form
+.nf
+.B
+.ti +.5i
+.ta \w'Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'TYPE\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
+.sp
+Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+.sp
+For example:
+.ti +.5i
+.sp
+Rule USA 1969 1973 \- Apr lastSun 2:00 1:00 D
+.sp
+.fi
+The fields that make up a rule line are:
+.TP "\w'LETTER/S'u"
+.B NAME
+Gives the (arbitrary) name of the set of rules this rule is part of.
+.TP
+.B FROM
+Gives the first year in which the rule applies.
+The word
+.B minimum
+(or an abbreviation) means the minimum year with a representable time value.
+The word
+.B maximum
+(or an abbreviation) means the maximum year with a representable time value.
+.TP
+.B TO
+Gives the final year in which the rule applies.
+In addition to
+.B minimum
+and
+.B maximum
+(as above),
+the word
+.B only
+(or an abbreviation)
+may be used to repeat the value of the
+.B FROM
+field.
+.TP
+.B TYPE
+Gives the type of year in which the rule applies.
+If
+.B TYPE
+is
+.B \-
+then the rule applies in all years between
+.B FROM
+and
+.B TO
+inclusive;
+if
+.B TYPE
+is
+.BR uspres ,
+the rule applies in U.S. Presidential election years;
+if
+.B TYPE
+is
+.BR nonpres ,
+the rule applies in years other than U.S. Presidential election years.
+If
+.B TYPE
+is something else, then
+.I zic
+executes the command
+.ti +.5i
+\fByearistype\fP \fIyear\fP \fItype\fP
+.br
+to check the type of a year:
+an exit status of zero is taken to mean that the year is of the given type;
+an exit status of one is taken to mean that the year is not of the given type.
+.TP
+.B IN
+Names the month in which the rule takes effect.
+Month names may be abbreviated.
+.TP
+.B ON
+Gives the day on which the rule takes effect.
+Recognized forms include:
+.nf
+.in +.5i
+.sp
+.ta \w'Sun<=25\0\0'u
+5 the fifth of the month
+lastSun the last Sunday in the month
+lastMon the last Monday in the month
+Sun>=8 first Sunday on or after the eighth
+Sun<=25 last Sunday on or before the 25th
+.fi
+.in -.5i
+.sp
+Names of days of the week may be abbreviated or spelled out in full.
+Note that there must be no spaces within the
+.B ON
+field.
+.TP
+.B AT
+Gives the time of day at which the rule takes effect.
+Recognized forms include:
+.nf
+.in +.5i
+.sp
+.ta \w'1:28:13\0\0'u
+2 time in hours
+2:00 time in hours and minutes
+15:00 24-hour format time (for times after noon)
+1:28:14 time in hours, minutes, and seconds
+.fi
+.in -.5i
+.sp
+Any of these forms may be followed by the letter
+.B w
+if the given time is local
+.q "wall clock"
+time or
+.B s
+if the given time is local
+.q standard
+time; in the absence of
+.B w
+or
+.BR s ,
+wall clock time is assumed.
+.TP
+.B SAVE
+Gives the amount of time to be added to local standard time when the rule is in
+effect.
+This field has the same format as the
+.B AT
+field
+(although, of course, the
+.B w
+and
+.B s
+suffixes are not used).
+.TP
+.B LETTER/S
+Gives the
+.q "variable part"
+(for example, the
+.q S
+or
+.q D
+in
+.q EST
+or
+.q EDT )
+of time zone abbreviations to be used when this rule is in effect.
+If this field is
+.BR \- ,
+the variable part is null.
+.PP
+A zone line has the form
+.sp
+.nf
+.ti +.5i
+.ta \w'Zone\0\0'u +\w'Australia/South\-west\0\0'u +\w'GMTOFF\0\0'u +\w'RULES/SAVE\0\0'u +\w'FORMAT\0\0'u
+Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
+.sp
+For example:
+.sp
+.ti +.5i
+Zone Australia/South\-west 9:30 Aus CST 1987 Mar 15 2:00
+.sp
+.fi
+The fields that make up a zone line are:
+.TP "\w'GMTOFF'u"
+.B NAME
+The name of the time zone.
+This is the name used in creating the time conversion information file for the
+zone.
+.TP
+.B GMTOFF
+The amount of time to add to GMT to get standard time in this zone.
+This field has the same format as the
+.B AT
+and
+.B SAVE
+fields of rule lines;
+begin the field with a minus sign if time must be subtracted from GMT.
+.TP
+.B RULES/SAVE
+The name of the rule(s) that apply in the time zone or,
+alternately, an amount of time to add to local standard time.
+If this field is
+.B \-
+then standard time always applies in the time zone.
+.TP
+.B FORMAT
+The format for time zone abbreviations in this time zone.
+The pair of characters
+.B %s
+is used to show where the
+.q "variable part"
+of the time zone abbreviation goes.
+.TP
+.B UNTIL
+The time at which the GMT offset or the rule(s) change for a location.
+It is specified as a year, a month, a day, and a time of day.
+If this is specified,
+the time zone information is generated from the given GMT offset
+and rule change until the time specified.
+.IP
+The next line must be a
+.q continuation
+line; this has the same form as a zone line except that the
+string
+.q Zone
+and the name are omitted, as the continuation line will
+place information starting at the time specified as the
+.B UNTIL
+field in the previous line in the file used by the previous line.
+Continuation lines may contain an
+.B UNTIL
+field, just as zone lines do, indicating that the next line is a further
+continuation.
+.PP
+A link line has the form
+.sp
+.nf
+.ti +.5i
+.if t .ta \w'Link\0\0'u +\w'LINK-FROM\0\0'u
+.if n .ta \w'Link\0\0'u +\w'US/Eastern\0\0'u
+Link LINK-FROM LINK-TO
+.sp
+For example:
+.sp
+.ti +.5i
+Link US/Eastern EST5EDT
+.sp
+.fi
+The
+.B LINK-FROM
+field should appear as the
+.B NAME
+field in some zone line;
+the
+.B LINK-TO
+field is used as an alternate name for that zone.
+.PP
+Except for continuation lines,
+lines may appear in any order in the input.
+.PP
+Lines in the file that describes leap seconds have the following form:
+.nf
+.B
+.ti +.5i
+.ta \w'Leap\0\0'u +\w'YEAR\0\0'u +\w'MONTH\0\0'u +\w'DAY\0\0'u +\w'HH:MM:SS\0\0'u +\w'CORR\0\0'u
+Leap YEAR MONTH DAY HH:MM:SS CORR R/S
+.sp
+For example:
+.ti +.5i
+.sp
+Leap 1974 Dec 31 23:59:60 + S
+.sp
+.fi
+The
+.BR YEAR ,
+.BR MONTH ,
+.BR DAY ,
+and
+.B HH:MM:SS
+fields tell when the leap second happened.
+The
+.B CORR
+field
+should be
+.q +
+if a second was added
+or
+.q -
+if a second was skipped.
+The
+.B R/S
+field
+should be (an abbreviation of)
+.q Stationary
+if the leap second time given by the other fields should be interpreted as GMT
+or
+(an abbreviation of)
+.q Rolling
+if the leap second time given by the other fields should be interpreted as
+local wall clock time.
+.SH NOTE
+For areas with more than two types of local time,
+you may need to use local standard time in the
+.B AT
+field of the earliest transition time's rule to ensure that
+the earliest transition time recorded in the compiled file is correct.
+.SH FILE
+/etc/zoneinfo standard directory used for created files
+.SH "SEE ALSO"
+newctime(3), tzfile(5), zdump(8)
+.. @(#)zic.8 4.4
diff --git a/share/zoneinfo/zic.c b/share/zoneinfo/zic.c
new file mode 100644
index 0000000..8d80e63
--- /dev/null
+++ b/share/zoneinfo/zic.c
@@ -0,0 +1,1892 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Arthur David Olson of the National Cancer Institute.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)zic.c 8.1 (Berkeley) 7/19/93";
+#endif /* not lint */
+
+#ifdef notdef
+static char elsieid[] = "@(#)zic.c 4.12";
+#endif
+
+#include <sys/types.h>
+#include <sys/cdefs.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <tzfile.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif /* !defined TRUE */
+
+struct rule {
+ const char * r_filename;
+ int r_linenum;
+ const char * r_name;
+
+ int r_loyear; /* for example, 1986 */
+ int r_hiyear; /* for example, 1986 */
+ const char * r_yrtype;
+
+ int r_month; /* 0..11 */
+
+ int r_dycode; /* see below */
+ int r_dayofmonth;
+ int r_wday;
+
+ long r_tod; /* time from midnight */
+ int r_todisstd; /* above is standard time if TRUE */
+ /* or wall clock time if FALSE */
+ long r_stdoff; /* offset from standard time */
+ const char * r_abbrvar; /* variable part of abbreviation */
+
+ int r_todo; /* a rule to do (used in outzone) */
+ time_t r_temp; /* used in outzone */
+};
+
+/*
+** r_dycode r_dayofmonth r_wday
+*/
+
+#define DC_DOM 0 /* 1..31 */ /* unused */
+#define DC_DOWGEQ 1 /* 1..31 */ /* 0..6 (Sun..Sat) */
+#define DC_DOWLEQ 2 /* 1..31 */ /* 0..6 (Sun..Sat) */
+
+struct zone {
+ const char * z_filename;
+ int z_linenum;
+
+ const char * z_name;
+ long z_gmtoff;
+ const char * z_rule;
+ const char * z_format;
+
+ long z_stdoff;
+
+ struct rule * z_rules;
+ int z_nrules;
+
+ struct rule z_untilrule;
+ time_t z_untiltime;
+};
+
+extern char * icatalloc __P((char * old, const char * new));
+extern char * icpyalloc __P((const char * string));
+extern void ifree __P((char * p));
+extern char * imalloc __P((int n));
+extern char * irealloc __P((char * old, int n));
+extern int link __P((const char * fromname, const char * toname));
+extern char * optarg;
+extern int optind;
+extern void perror __P((const char * string));
+extern char * scheck __P((const char * string, const char * format));
+static void addtt __P((time_t starttime, int type));
+static int addtype
+ __P((long gmtoff, const char * abbr, int isdst,
+ int ttisstd));
+static void addleap __P((time_t t, int positive, int rolling));
+static void adjleap __P((void));
+static void associate __P((void));
+static int ciequal __P((const char * ap, const char * bp));
+static void convert __P((long val, char * buf));
+static void dolink __P((const char * fromfile, const char * tofile));
+static void eat __P((const char * name, int num));
+static void eats __P((const char * name, int num,
+ const char * rname, int rnum));
+static long eitol __P((int i));
+static void error __P((const char * message));
+static char ** getfields __P((char * buf));
+static long gethms __P((char * string, const char * errstrng,
+ int signable));
+static void infile __P((const char * filename));
+static void inleap __P((char ** fields, int nfields));
+static void inlink __P((char ** fields, int nfields));
+static void inrule __P((char ** fields, int nfields));
+static int inzcont __P((char ** fields, int nfields));
+static int inzone __P((char ** fields, int nfields));
+static int inzsub __P((char ** fields, int nfields, int iscont));
+static int itsabbr __P((const char * abbr, const char * word));
+static int itsdir __P((const char * name));
+static int lowerit __P((int c));
+static char * memcheck __P((char * tocheck));
+static int mkdirs __P((char * filename));
+static void newabbr __P((const char * abbr));
+static long oadd __P((long t1, long t2));
+static void outzone __P((const struct zone * zp, int ntzones));
+static void puttzcode __P((long code, FILE * fp));
+static int rcomp __P((const void *leftp, const void *rightp));
+static time_t rpytime __P((const struct rule * rp, int wantedy));
+static void rulesub __P((struct rule * rp, char * loyearp, char * hiyearp,
+ char * typep, char * monthp, char * dayp, char * timep));
+static void setboundaries __P((void));
+static time_t tadd __P((time_t t1, long t2));
+static void usage __P((void));
+static void writezone __P((const char * name));
+static int yearistype __P((int year, const char * type));
+
+static int charcnt;
+static int errors;
+static const char * filename;
+static int leapcnt;
+static int linenum;
+static time_t max_time;
+static int max_year;
+static time_t min_time;
+static int min_year;
+static int noise;
+static const char * rfilename;
+static int rlinenum;
+static const char * progname;
+static int timecnt;
+static int typecnt;
+static int tt_signed;
+
+/*
+** Line codes.
+*/
+
+#define LC_RULE 0
+#define LC_ZONE 1
+#define LC_LINK 2
+#define LC_LEAP 3
+
+/*
+** Which fields are which on a Zone line.
+*/
+
+#define ZF_NAME 1
+#define ZF_GMTOFF 2
+#define ZF_RULE 3
+#define ZF_FORMAT 4
+#define ZF_TILYEAR 5
+#define ZF_TILMONTH 6
+#define ZF_TILDAY 7
+#define ZF_TILTIME 8
+#define ZONE_MINFIELDS 5
+#define ZONE_MAXFIELDS 9
+
+/*
+** Which fields are which on a Zone continuation line.
+*/
+
+#define ZFC_GMTOFF 0
+#define ZFC_RULE 1
+#define ZFC_FORMAT 2
+#define ZFC_TILYEAR 3
+#define ZFC_TILMONTH 4
+#define ZFC_TILDAY 5
+#define ZFC_TILTIME 6
+#define ZONEC_MINFIELDS 3
+#define ZONEC_MAXFIELDS 7
+
+/*
+** Which files are which on a Rule line.
+*/
+
+#define RF_NAME 1
+#define RF_LOYEAR 2
+#define RF_HIYEAR 3
+#define RF_COMMAND 4
+#define RF_MONTH 5
+#define RF_DAY 6
+#define RF_TOD 7
+#define RF_STDOFF 8
+#define RF_ABBRVAR 9
+#define RULE_FIELDS 10
+
+/*
+** Which fields are which on a Link line.
+*/
+
+#define LF_FROM 1
+#define LF_TO 2
+#define LINK_FIELDS 3
+
+/*
+** Which fields are which on a Leap line.
+*/
+
+#define LP_YEAR 1
+#define LP_MONTH 2
+#define LP_DAY 3
+#define LP_TIME 4
+#define LP_CORR 5
+#define LP_ROLL 6
+#define LEAP_FIELDS 7
+
+/*
+** Year synonyms.
+*/
+
+#define YR_MINIMUM 0
+#define YR_MAXIMUM 1
+#define YR_ONLY 2
+
+static struct rule * rules;
+static int nrules; /* number of rules */
+
+static struct zone * zones;
+static int nzones; /* number of zones */
+
+struct link {
+ const char * l_filename;
+ int l_linenum;
+ const char * l_from;
+ const char * l_to;
+};
+
+static struct link * links;
+static int nlinks;
+
+struct lookup {
+ const char * l_word;
+ const int l_value;
+};
+
+static struct lookup const * byword __P((const char * string,
+ const struct lookup * lp));
+
+static struct lookup const line_codes[] = {
+ "Rule", LC_RULE,
+ "Zone", LC_ZONE,
+ "Link", LC_LINK,
+ "Leap", LC_LEAP,
+ NULL, 0
+};
+
+static struct lookup const mon_names[] = {
+ "January", TM_JANUARY,
+ "February", TM_FEBRUARY,
+ "March", TM_MARCH,
+ "April", TM_APRIL,
+ "May", TM_MAY,
+ "June", TM_JUNE,
+ "July", TM_JULY,
+ "August", TM_AUGUST,
+ "September", TM_SEPTEMBER,
+ "October", TM_OCTOBER,
+ "November", TM_NOVEMBER,
+ "December", TM_DECEMBER,
+ NULL, 0
+};
+
+static struct lookup const wday_names[] = {
+ "Sunday", TM_SUNDAY,
+ "Monday", TM_MONDAY,
+ "Tuesday", TM_TUESDAY,
+ "Wednesday", TM_WEDNESDAY,
+ "Thursday", TM_THURSDAY,
+ "Friday", TM_FRIDAY,
+ "Saturday", TM_SATURDAY,
+ NULL, 0
+};
+
+static struct lookup const lasts[] = {
+ "last-Sunday", TM_SUNDAY,
+ "last-Monday", TM_MONDAY,
+ "last-Tuesday", TM_TUESDAY,
+ "last-Wednesday", TM_WEDNESDAY,
+ "last-Thursday", TM_THURSDAY,
+ "last-Friday", TM_FRIDAY,
+ "last-Saturday", TM_SATURDAY,
+ NULL, 0
+};
+
+static struct lookup const begin_years[] = {
+ "minimum", YR_MINIMUM,
+ "maximum", YR_MAXIMUM,
+ NULL, 0
+};
+
+static struct lookup const end_years[] = {
+ "minimum", YR_MINIMUM,
+ "maximum", YR_MAXIMUM,
+ "only", YR_ONLY,
+ NULL, 0
+};
+
+static struct lookup const leap_types[] = {
+ "Rolling", TRUE,
+ "Stationary", FALSE,
+ NULL, 0
+};
+
+static const int len_months[2][MONSPERYEAR] = {
+ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
+ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+};
+
+static const int len_years[2] = {
+ DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+static time_t ats[TZ_MAX_TIMES];
+static unsigned char types[TZ_MAX_TIMES];
+static long gmtoffs[TZ_MAX_TYPES];
+static char isdsts[TZ_MAX_TYPES];
+static char abbrinds[TZ_MAX_TYPES];
+static char ttisstds[TZ_MAX_TYPES];
+static char chars[TZ_MAX_CHARS];
+static time_t trans[TZ_MAX_LEAPS];
+static long corr[TZ_MAX_LEAPS];
+static char roll[TZ_MAX_LEAPS];
+
+/*
+** Memory allocation.
+*/
+
+static char *
+memcheck(ptr)
+char * const ptr;
+{
+ if (ptr == NULL) {
+ (void) perror(progname);
+ (void) exit(EXIT_FAILURE);
+ }
+ return ptr;
+}
+
+#define emalloc(size) memcheck(imalloc(size))
+#define erealloc(ptr, size) memcheck(irealloc(ptr, size))
+#define ecpyalloc(ptr) memcheck(icpyalloc(ptr))
+#define ecatalloc(oldp, newp) memcheck(icatalloc(oldp, newp))
+
+/*
+** Error handling.
+*/
+
+static void
+eats(name, num, rname, rnum)
+const char * const name;
+const int num;
+const char * const rname;
+const int rnum;
+{
+ filename = name;
+ linenum = num;
+ rfilename = rname;
+ rlinenum = rnum;
+}
+
+static void
+eat(name, num)
+const char * const name;
+const int num;
+{
+ eats(name, num, (char *) NULL, -1);
+}
+
+static void
+error(string)
+const char * const string;
+{
+ /*
+ ** Match the format of "cc" to allow sh users to
+ ** zic ... 2>&1 | error -t "*" -v
+ ** on BSD systems.
+ */
+ (void) fprintf(stderr, "\"%s\", line %d: %s",
+ filename, linenum, string);
+ if (rfilename != NULL)
+ (void) fprintf(stderr, " (rule from \"%s\", line %d)",
+ rfilename, rlinenum);
+ (void) fprintf(stderr, "\n");
+ ++errors;
+}
+
+static void
+usage()
+{
+ (void) fprintf(stderr,
+"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]\n\
+\t[ -L leapseconds ] [ filename ... ]\n",
+ progname, progname);
+ (void) exit(EXIT_FAILURE);
+}
+
+static const char * psxrules = NULL;
+static const char * lcltime = NULL;
+static const char * directory = NULL;
+static const char * leapsec = NULL;
+static int sflag = FALSE;
+
+int
+main(argc, argv)
+int argc;
+char * argv[];
+{
+ register int i, j;
+ register int c;
+
+ (void) umask(umask(022) | 022);
+ progname = argv[0];
+ while ((c = getopt(argc, argv, "d:l:p:L:vs")) != EOF)
+ switch (c) {
+ default:
+ usage();
+ case 'd':
+ if (directory == NULL)
+ directory = optarg;
+ else {
+ (void) fprintf(stderr,
+"%s: More than one -d option specified\n",
+ progname);
+ (void) exit(EXIT_FAILURE);
+ }
+ break;
+ case 'l':
+ if (lcltime == NULL)
+ lcltime = optarg;
+ else {
+ (void) fprintf(stderr,
+"%s: More than one -l option specified\n",
+ progname);
+ (void) exit(EXIT_FAILURE);
+ }
+ break;
+ case 'p':
+ if (psxrules == NULL)
+ psxrules = optarg;
+ else {
+ (void) fprintf(stderr,
+"%s: More than one -p option specified\n",
+ progname);
+ (void) exit(EXIT_FAILURE);
+ }
+ break;
+ case 'L':
+ if (leapsec == NULL)
+ leapsec = optarg;
+ else {
+ (void) fprintf(stderr,
+"%s: More than one -L option specified\n",
+ progname);
+ (void) exit(EXIT_FAILURE);
+ }
+ break;
+ case 'v':
+ noise = TRUE;
+ break;
+ case 's':
+ sflag = TRUE;
+ break;
+ }
+ if (optind == argc - 1 && strcmp(argv[optind], "=") == 0)
+ usage(); /* usage message by request */
+ if (directory == NULL)
+ directory = TZDIR;
+
+ setboundaries();
+
+ if (optind < argc && leapsec != NULL) {
+ infile(leapsec);
+ adjleap();
+ }
+
+ zones = (struct zone *) emalloc(0);
+ rules = (struct rule *) emalloc(0);
+ links = (struct link *) emalloc(0);
+ for (i = optind; i < argc; ++i)
+ infile(argv[i]);
+ if (errors)
+ (void) exit(EXIT_FAILURE);
+ associate();
+ for (i = 0; i < nzones; i = j) {
+ /*
+ ** Find the next non-continuation zone entry.
+ */
+ for (j = i + 1; j < nzones && zones[j].z_name == NULL; ++j)
+ ;
+ outzone(&zones[i], j - i);
+ }
+ /*
+ ** Make links.
+ */
+ for (i = 0; i < nlinks; ++i)
+ dolink(links[i].l_from, links[i].l_to);
+ if (lcltime != NULL)
+ dolink(lcltime, TZDEFAULT);
+ if (psxrules != NULL)
+ dolink(psxrules, TZDEFRULES);
+ return (errors == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+static void
+dolink(fromfile, tofile)
+const char * const fromfile;
+const char * const tofile;
+{
+ register char * fromname;
+ register char * toname;
+
+ fromname = ecpyalloc(directory);
+ fromname = ecatalloc(fromname, "/");
+ fromname = ecatalloc(fromname, fromfile);
+ toname = ecpyalloc(directory);
+ toname = ecatalloc(toname, "/");
+ toname = ecatalloc(toname, tofile);
+ /*
+ ** We get to be careful here since
+ ** there's a fair chance of root running us.
+ */
+ if (!itsdir(toname))
+ (void) remove(toname);
+ if (link(fromname, toname) != 0) {
+ (void) fprintf(stderr, "%s: Can't link from %s to ",
+ progname, fromname);
+ (void) perror(toname);
+ (void) exit(EXIT_FAILURE);
+ }
+ ifree(fromname);
+ ifree(toname);
+}
+
+static void
+setboundaries()
+{
+ register time_t bit;
+
+ for (bit = 1; bit > 0; bit <<= 1)
+ ;
+ if (bit == 0) { /* time_t is an unsigned type */
+ tt_signed = FALSE;
+ min_time = 0;
+ max_time = ~(time_t) 0;
+ if (sflag)
+ max_time >>= 1;
+ } else {
+ tt_signed = TRUE;
+ min_time = bit;
+ max_time = bit;
+ ++max_time;
+ max_time = -max_time;
+ if (sflag)
+ min_time = 0;
+ }
+ min_year = TM_YEAR_BASE + gmtime(&min_time)->tm_year;
+ max_year = TM_YEAR_BASE + gmtime(&max_time)->tm_year;
+}
+
+static int
+itsdir(name)
+const char * const name;
+{
+ struct stat s;
+
+ return (stat(name, &s) == 0 && S_ISDIR(s.st_mode));
+}
+
+/*
+** Associate sets of rules with zones.
+*/
+
+/*
+** Sort by rule name.
+*/
+
+static int
+rcomp(cp1, cp2)
+const void * cp1;
+const void * cp2;
+{
+ return strcmp(((struct rule *) cp1)->r_name,
+ ((struct rule *) cp2)->r_name);
+}
+
+static void
+associate()
+{
+ register struct zone * zp;
+ register struct rule * rp;
+ register int base, out;
+ register int i;
+
+ if (nrules != 0)
+ (void) qsort((void *) rules, (size_t) nrules,
+ (size_t) sizeof *rules, rcomp);
+ for (i = 0; i < nzones; ++i) {
+ zp = &zones[i];
+ zp->z_rules = NULL;
+ zp->z_nrules = 0;
+ }
+ for (base = 0; base < nrules; base = out) {
+ rp = &rules[base];
+ for (out = base + 1; out < nrules; ++out)
+ if (strcmp(rp->r_name, rules[out].r_name) != 0)
+ break;
+ for (i = 0; i < nzones; ++i) {
+ zp = &zones[i];
+ if (strcmp(zp->z_rule, rp->r_name) != 0)
+ continue;
+ zp->z_rules = rp;
+ zp->z_nrules = out - base;
+ }
+ }
+ for (i = 0; i < nzones; ++i) {
+ zp = &zones[i];
+ if (zp->z_nrules == 0) {
+ /*
+ ** Maybe we have a local standard time offset.
+ */
+ eat(zp->z_filename, zp->z_linenum);
+ zp->z_stdoff =
+ gethms((char *)zp->z_rule, "unruly zone", TRUE);
+ /*
+ ** Note, though, that if there's no rule,
+ ** a '%s' in the format is a bad thing.
+ */
+ if (strchr(zp->z_format, '%') != 0)
+ error("%s in ruleless zone");
+ }
+ }
+ if (errors)
+ (void) exit(EXIT_FAILURE);
+}
+
+static void
+infile(name)
+const char * name;
+{
+ register FILE * fp;
+ register char ** fields;
+ register char * cp;
+ register const struct lookup * lp;
+ register int nfields;
+ register int wantcont;
+ register int num;
+ char buf[BUFSIZ];
+
+ if (strcmp(name, "-") == 0) {
+ name = "standard input";
+ fp = stdin;
+ } else if ((fp = fopen(name, "r")) == NULL) {
+ (void) fprintf(stderr, "%s: Can't open ", progname);
+ (void) perror(name);
+ (void) exit(EXIT_FAILURE);
+ }
+ wantcont = FALSE;
+ for (num = 1; ; ++num) {
+ eat(name, num);
+ if (fgets(buf, (int) sizeof buf, fp) != buf)
+ break;
+ cp = strchr(buf, '\n');
+ if (cp == NULL) {
+ error("line too long");
+ (void) exit(EXIT_FAILURE);
+ }
+ *cp = '\0';
+ fields = getfields(buf);
+ nfields = 0;
+ while (fields[nfields] != NULL) {
+ if (ciequal(fields[nfields], "-"))
+ fields[nfields] = "";
+ ++nfields;
+ }
+ if (nfields == 0) {
+ /* nothing to do */
+ } else if (wantcont) {
+ wantcont = inzcont(fields, nfields);
+ } else {
+ lp = byword(fields[0], line_codes);
+ if (lp == NULL)
+ error("input line of unknown type");
+ else switch ((int) (lp->l_value)) {
+ case LC_RULE:
+ inrule(fields, nfields);
+ wantcont = FALSE;
+ break;
+ case LC_ZONE:
+ wantcont = inzone(fields, nfields);
+ break;
+ case LC_LINK:
+ inlink(fields, nfields);
+ wantcont = FALSE;
+ break;
+ case LC_LEAP:
+ if (name != leapsec)
+ (void) fprintf(stderr,
+"%s: Leap line in non leap seconds file %s\n",
+ progname, name);
+ else inleap(fields, nfields);
+ wantcont = FALSE;
+ break;
+ default: /* "cannot happen" */
+ (void) fprintf(stderr,
+"%s: panic: Invalid l_value %d\n",
+ progname, lp->l_value);
+ (void) exit(EXIT_FAILURE);
+ }
+ }
+ ifree((char *) fields);
+ }
+ if (ferror(fp)) {
+ (void) fprintf(stderr, "%s: Error reading ", progname);
+ (void) perror(filename);
+ (void) exit(EXIT_FAILURE);
+ }
+ if (fp != stdin && fclose(fp)) {
+ (void) fprintf(stderr, "%s: Error closing ", progname);
+ (void) perror(filename);
+ (void) exit(EXIT_FAILURE);
+ }
+ if (wantcont)
+ error("expected continuation line not found");
+}
+
+/*
+** Convert a string of one of the forms
+** h -h hh:mm -hh:mm hh:mm:ss -hh:mm:ss
+** into a number of seconds.
+** A null string maps to zero.
+** Call error with errstring and return zero on errors.
+*/
+
+static long
+gethms(string, errstring, signable)
+char * string;
+const char * const errstring;
+const int signable;
+{
+ int hh, mm, ss, sign;
+
+ if (string == NULL || *string == '\0')
+ return 0;
+ if (!signable)
+ sign = 1;
+ else if (*string == '-') {
+ sign = -1;
+ ++string;
+ } else sign = 1;
+ if (sscanf(string, scheck(string, "%d"), &hh) == 1)
+ mm = ss = 0;
+ else if (sscanf(string, scheck(string, "%d:%d"), &hh, &mm) == 2)
+ ss = 0;
+ else if (sscanf(string, scheck(string, "%d:%d:%d"),
+ &hh, &mm, &ss) != 3) {
+ error(errstring);
+ return 0;
+ }
+ if (hh < 0 || hh >= HOURSPERDAY ||
+ mm < 0 || mm >= MINSPERHOUR ||
+ ss < 0 || ss > SECSPERMIN) {
+ error(errstring);
+ return 0;
+ }
+ return eitol(sign) *
+ (eitol(hh * MINSPERHOUR + mm) *
+ eitol(SECSPERMIN) + eitol(ss));
+}
+
+static void
+inrule(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ static struct rule r;
+
+ if (nfields != RULE_FIELDS) {
+ error("wrong number of fields on Rule line");
+ return;
+ }
+ if (*fields[RF_NAME] == '\0') {
+ error("nameless rule");
+ return;
+ }
+ r.r_filename = filename;
+ r.r_linenum = linenum;
+ r.r_stdoff = gethms(fields[RF_STDOFF], "invalid saved time", TRUE);
+ rulesub(&r, fields[RF_LOYEAR], fields[RF_HIYEAR], fields[RF_COMMAND],
+ fields[RF_MONTH], fields[RF_DAY], fields[RF_TOD]);
+ r.r_name = ecpyalloc(fields[RF_NAME]);
+ r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
+ rules = (struct rule *) erealloc((char *) rules,
+ (int) ((nrules + 1) * sizeof *rules));
+ rules[nrules++] = r;
+}
+
+static int
+inzone(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ register int i;
+ char buf[132];
+
+ if (nfields < ZONE_MINFIELDS || nfields > ZONE_MAXFIELDS) {
+ error("wrong number of fields on Zone line");
+ return FALSE;
+ }
+ if (strcmp(fields[ZF_NAME], TZDEFAULT) == 0 && lcltime != NULL) {
+ (void) sprintf(buf,
+ "\"Zone %s\" line and -l option are mutually exclusive",
+ TZDEFAULT);
+ error(buf);
+ return FALSE;
+ }
+ if (strcmp(fields[ZF_NAME], TZDEFRULES) == 0 && psxrules != NULL) {
+ (void) sprintf(buf,
+ "\"Zone %s\" line and -p option are mutually exclusive",
+ TZDEFRULES);
+ error(buf);
+ return FALSE;
+ }
+ for (i = 0; i < nzones; ++i)
+ if (zones[i].z_name != NULL &&
+ strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
+ (void) sprintf(buf,
+"duplicate zone name %s (file \"%s\", line %d)",
+ fields[ZF_NAME],
+ zones[i].z_filename,
+ zones[i].z_linenum);
+ error(buf);
+ return FALSE;
+ }
+ return inzsub(fields, nfields, FALSE);
+}
+
+static int
+inzcont(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ if (nfields < ZONEC_MINFIELDS || nfields > ZONEC_MAXFIELDS) {
+ error("wrong number of fields on Zone continuation line");
+ return FALSE;
+ }
+ return inzsub(fields, nfields, TRUE);
+}
+
+static int
+inzsub(fields, nfields, iscont)
+register char ** const fields;
+const int nfields;
+const int iscont;
+{
+ register char * cp;
+ static struct zone z;
+ register int i_gmtoff, i_rule, i_format;
+ register int i_untilyear, i_untilmonth;
+ register int i_untilday, i_untiltime;
+ register int hasuntil;
+
+ if (iscont) {
+ i_gmtoff = ZFC_GMTOFF;
+ i_rule = ZFC_RULE;
+ i_format = ZFC_FORMAT;
+ i_untilyear = ZFC_TILYEAR;
+ i_untilmonth = ZFC_TILMONTH;
+ i_untilday = ZFC_TILDAY;
+ i_untiltime = ZFC_TILTIME;
+ z.z_name = NULL;
+ } else {
+ i_gmtoff = ZF_GMTOFF;
+ i_rule = ZF_RULE;
+ i_format = ZF_FORMAT;
+ i_untilyear = ZF_TILYEAR;
+ i_untilmonth = ZF_TILMONTH;
+ i_untilday = ZF_TILDAY;
+ i_untiltime = ZF_TILTIME;
+ z.z_name = ecpyalloc(fields[ZF_NAME]);
+ }
+ z.z_filename = filename;
+ z.z_linenum = linenum;
+ z.z_gmtoff = gethms(fields[i_gmtoff], "invalid GMT offset", TRUE);
+ if ((cp = strchr(fields[i_format], '%')) != 0) {
+ if (*++cp != 's' || strchr(cp, '%') != 0) {
+ error("invalid abbreviation format");
+ return FALSE;
+ }
+ }
+ z.z_rule = ecpyalloc(fields[i_rule]);
+ z.z_format = ecpyalloc(fields[i_format]);
+ hasuntil = nfields > i_untilyear;
+ if (hasuntil) {
+ z.z_untilrule.r_filename = filename;
+ z.z_untilrule.r_linenum = linenum;
+ rulesub(&z.z_untilrule,
+ fields[i_untilyear],
+ "only",
+ "",
+ (nfields > i_untilmonth) ? fields[i_untilmonth] : "Jan",
+ (nfields > i_untilday) ? fields[i_untilday] : "1",
+ (nfields > i_untiltime) ? fields[i_untiltime] : "0");
+ z.z_untiltime = rpytime(&z.z_untilrule, z.z_untilrule.r_loyear);
+ if (iscont && nzones > 0 && z.z_untiltime < max_time &&
+ z.z_untiltime > min_time &&
+ zones[nzones - 1].z_untiltime >= z.z_untiltime) {
+error("Zone continuation line end time is not after end time of previous line");
+ return FALSE;
+ }
+ }
+ zones = (struct zone *) erealloc((char *) zones,
+ (int) ((nzones + 1) * sizeof *zones));
+ zones[nzones++] = z;
+ /*
+ ** If there was an UNTIL field on this line,
+ ** there's more information about the zone on the next line.
+ */
+ return hasuntil;
+}
+
+static void
+inleap(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ register const char * cp;
+ register const struct lookup * lp;
+ register int i, j;
+ int year, month, day;
+ long dayoff, tod;
+ time_t t;
+
+ if (nfields != LEAP_FIELDS) {
+ error("wrong number of fields on Leap line");
+ return;
+ }
+ dayoff = 0;
+ cp = fields[LP_YEAR];
+ if (sscanf((char *)cp, scheck(cp, "%d"), &year) != 1 ||
+ year < min_year || year > max_year) {
+ /*
+ * Leapin' Lizards!
+ */
+ error("invalid leaping year");
+ return;
+ }
+ j = EPOCH_YEAR;
+ while (j != year) {
+ if (year > j) {
+ i = len_years[isleap(j)];
+ ++j;
+ } else {
+ --j;
+ i = -len_years[isleap(j)];
+ }
+ dayoff = oadd(dayoff, eitol(i));
+ }
+ if ((lp = byword(fields[LP_MONTH], mon_names)) == NULL) {
+ error("invalid month name");
+ return;
+ }
+ month = lp->l_value;
+ j = TM_JANUARY;
+ while (j != month) {
+ i = len_months[isleap(year)][j];
+ dayoff = oadd(dayoff, eitol(i));
+ ++j;
+ }
+ cp = fields[LP_DAY];
+ if (sscanf((char *)cp, scheck(cp, "%d"), &day) != 1 ||
+ day <= 0 || day > len_months[isleap(year)][month]) {
+ error("invalid day of month");
+ return;
+ }
+ dayoff = oadd(dayoff, eitol(day - 1));
+ if (dayoff < 0 && !tt_signed) {
+ error("time before zero");
+ return;
+ }
+ t = (time_t) dayoff * SECSPERDAY;
+ /*
+ ** Cheap overflow check.
+ */
+ if (t / SECSPERDAY != dayoff) {
+ error("time overflow");
+ return;
+ }
+ tod = gethms(fields[LP_TIME], "invalid time of day", FALSE);
+ cp = fields[LP_CORR];
+ if (strcmp(cp, "+") != 0 && strcmp(cp, "") != 0) {
+ /* infile() turned "-" into "" */
+ error("illegal CORRECTION field on Leap line");
+ return;
+ }
+ if ((lp = byword(fields[LP_ROLL], leap_types)) == NULL) {
+ error("illegal Rolling/Stationary field on Leap line");
+ return;
+ }
+ addleap(tadd(t, tod), *cp == '+', lp->l_value);
+}
+
+static void
+inlink(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ struct link l;
+
+ if (nfields != LINK_FIELDS) {
+ error("wrong number of fields on Link line");
+ return;
+ }
+ if (*fields[LF_FROM] == '\0') {
+ error("blank FROM field on Link line");
+ return;
+ }
+ if (*fields[LF_TO] == '\0') {
+ error("blank TO field on Link line");
+ return;
+ }
+ l.l_filename = filename;
+ l.l_linenum = linenum;
+ l.l_from = ecpyalloc(fields[LF_FROM]);
+ l.l_to = ecpyalloc(fields[LF_TO]);
+ links = (struct link *) erealloc((char *) links,
+ (int) ((nlinks + 1) * sizeof *links));
+ links[nlinks++] = l;
+}
+
+static void
+rulesub(rp, loyearp, hiyearp, typep, monthp, dayp, timep)
+register struct rule * const rp;
+char * const loyearp;
+char * const hiyearp;
+char * const typep;
+char * const monthp;
+char * const dayp;
+char * const timep;
+{
+ register struct lookup const * lp;
+ register char * cp;
+
+ if ((lp = byword(monthp, mon_names)) == NULL) {
+ error("invalid month name");
+ return;
+ }
+ rp->r_month = lp->l_value;
+ rp->r_todisstd = FALSE;
+ cp = timep;
+ if (*cp != '\0') {
+ cp += strlen(cp) - 1;
+ switch (lowerit(*cp)) {
+ case 's':
+ rp->r_todisstd = TRUE;
+ *cp = '\0';
+ break;
+ case 'w':
+ rp->r_todisstd = FALSE;
+ *cp = '\0';
+ break;
+ }
+ }
+ rp->r_tod = gethms(timep, "invalid time of day", FALSE);
+ /*
+ ** Year work.
+ */
+ cp = loyearp;
+ if ((lp = byword(cp, begin_years)) != NULL) switch ((int) lp->l_value) {
+ case YR_MINIMUM:
+ rp->r_loyear = min_year;
+ break;
+ case YR_MAXIMUM:
+ rp->r_loyear = max_year;
+ break;
+ default: /* "cannot happen" */
+ (void) fprintf(stderr,
+ "%s: panic: Invalid l_value %d\n",
+ progname, lp->l_value);
+ (void) exit(EXIT_FAILURE);
+ } else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1 ||
+ rp->r_loyear < min_year || rp->r_loyear > max_year) {
+ if (noise)
+ error("invalid starting year");
+ if (rp->r_loyear > max_year)
+ return;
+ }
+ cp = hiyearp;
+ if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
+ case YR_MINIMUM:
+ rp->r_hiyear = min_year;
+ break;
+ case YR_MAXIMUM:
+ rp->r_hiyear = max_year;
+ break;
+ case YR_ONLY:
+ rp->r_hiyear = rp->r_loyear;
+ break;
+ default: /* "cannot happen" */
+ (void) fprintf(stderr,
+ "%s: panic: Invalid l_value %d\n",
+ progname, lp->l_value);
+ (void) exit(EXIT_FAILURE);
+ } else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1 ||
+ rp->r_hiyear < min_year || rp->r_hiyear > max_year) {
+ if (noise)
+ error("invalid ending year");
+ if (rp->r_hiyear < min_year)
+ return;
+ }
+ if (rp->r_hiyear < min_year)
+ return;
+ if (rp->r_loyear < min_year)
+ rp->r_loyear = min_year;
+ if (rp->r_hiyear > max_year)
+ rp->r_hiyear = max_year;
+ if (rp->r_loyear > rp->r_hiyear) {
+ error("starting year greater than ending year");
+ return;
+ }
+ if (*typep == '\0')
+ rp->r_yrtype = NULL;
+ else {
+ if (rp->r_loyear == rp->r_hiyear) {
+ error("typed single year");
+ return;
+ }
+ rp->r_yrtype = ecpyalloc(typep);
+ }
+ /*
+ ** Day work.
+ ** Accept things such as:
+ ** 1
+ ** last-Sunday
+ ** Sun<=20
+ ** Sun>=7
+ */
+ if ((lp = byword(dayp, lasts)) != NULL) {
+ rp->r_dycode = DC_DOWLEQ;
+ rp->r_wday = lp->l_value;
+ rp->r_dayofmonth = len_months[1][rp->r_month];
+ } else {
+ if ((cp = strchr(dayp, '<')) != 0)
+ rp->r_dycode = DC_DOWLEQ;
+ else if ((cp = strchr(dayp, '>')) != 0)
+ rp->r_dycode = DC_DOWGEQ;
+ else {
+ cp = dayp;
+ rp->r_dycode = DC_DOM;
+ }
+ if (rp->r_dycode != DC_DOM) {
+ *cp++ = 0;
+ if (*cp++ != '=') {
+ error("invalid day of month");
+ return;
+ }
+ if ((lp = byword(dayp, wday_names)) == NULL) {
+ error("invalid weekday name");
+ return;
+ }
+ rp->r_wday = lp->l_value;
+ }
+ if (sscanf(cp, scheck(cp, "%d"), &rp->r_dayofmonth) != 1 ||
+ rp->r_dayofmonth <= 0 ||
+ (rp->r_dayofmonth > len_months[1][rp->r_month])) {
+ error("invalid day of month");
+ return;
+ }
+ }
+}
+
+static void
+convert(val, buf)
+const long val;
+char * const buf;
+{
+ register int i;
+ register long shift;
+
+ for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
+ buf[i] = val >> shift;
+}
+
+static void
+puttzcode(val, fp)
+const long val;
+FILE * const fp;
+{
+ char buf[4];
+
+ convert(val, buf);
+ (void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
+}
+
+static void
+writezone(name)
+const char * const name;
+{
+ register FILE * fp;
+ register int i, j;
+ char fullname[BUFSIZ];
+ static struct tzhead tzh;
+
+ if (strlen(directory) + 1 + strlen(name) >= sizeof fullname) {
+ (void) fprintf(stderr,
+ "%s: File name %s/%s too long\n", progname,
+ directory, name);
+ (void) exit(EXIT_FAILURE);
+ }
+ (void) sprintf(fullname, "%s/%s", directory, name);
+ if ((fp = fopen(fullname, "wb")) == NULL) {
+ if (mkdirs(fullname) != 0)
+ (void) exit(EXIT_FAILURE);
+ if ((fp = fopen(fullname, "wb")) == NULL) {
+ (void) fprintf(stderr, "%s: Can't create ", progname);
+ (void) perror(fullname);
+ (void) exit(EXIT_FAILURE);
+ }
+ }
+ convert(eitol(typecnt), tzh.tzh_ttisstdcnt);
+ convert(eitol(leapcnt), tzh.tzh_leapcnt);
+ convert(eitol(timecnt), tzh.tzh_timecnt);
+ convert(eitol(typecnt), tzh.tzh_typecnt);
+ convert(eitol(charcnt), tzh.tzh_charcnt);
+ (void) fwrite((void *) &tzh, (size_t) sizeof tzh, (size_t) 1, fp);
+ for (i = 0; i < timecnt; ++i) {
+ j = leapcnt;
+ while (--j >= 0)
+ if (ats[i] >= trans[j]) {
+ ats[i] = tadd(ats[i], corr[j]);
+ break;
+ }
+ puttzcode((long) ats[i], fp);
+ }
+ if (timecnt > 0)
+ (void) fwrite((void *) types, (size_t) sizeof types[0],
+ (size_t) timecnt, fp);
+ for (i = 0; i < typecnt; ++i) {
+ puttzcode((long) gmtoffs[i], fp);
+ (void) putc(isdsts[i], fp);
+ (void) putc(abbrinds[i], fp);
+ }
+ if (charcnt != 0)
+ (void) fwrite((void *) chars, (size_t) sizeof chars[0],
+ (size_t) charcnt, fp);
+ for (i = 0; i < leapcnt; ++i) {
+ if (roll[i]) {
+ if (timecnt == 0 || trans[i] < ats[0]) {
+ j = 0;
+ while (isdsts[j])
+ if (++j >= typecnt) {
+ j = 0;
+ break;
+ }
+ } else {
+ j = 1;
+ while (j < timecnt && trans[i] >= ats[j])
+ ++j;
+ j = types[j - 1];
+ }
+ puttzcode((long) tadd(trans[i], -gmtoffs[j]), fp);
+ } else puttzcode((long) trans[i], fp);
+ puttzcode((long) corr[i], fp);
+ }
+ for (i = 0; i < typecnt; ++i)
+ (void) putc(ttisstds[i], fp);
+ if (ferror(fp) || fclose(fp)) {
+ (void) fprintf(stderr, "%s: Write error on ", progname);
+ (void) perror(fullname);
+ (void) exit(EXIT_FAILURE);
+ }
+}
+
+static void
+outzone(zpfirst, zonecount)
+const struct zone * const zpfirst;
+const int zonecount;
+{
+ register const struct zone * zp;
+ register struct rule * rp;
+ register int i, j;
+ register int usestart, useuntil;
+ register time_t starttime, untiltime;
+ register long gmtoff;
+ register long stdoff;
+ register int year;
+ register long startoff;
+ register int startisdst;
+ register int startttisstd;
+ register int type;
+ char startbuf[BUFSIZ];
+
+ /*
+ ** Now. . .finally. . .generate some useful data!
+ */
+ timecnt = 0;
+ typecnt = 0;
+ charcnt = 0;
+ /*
+ ** Two guesses. . .the second may well be corrected later.
+ */
+ gmtoff = zpfirst->z_gmtoff;
+ stdoff = 0;
+ starttime = 0;
+ startttisstd = FALSE;
+ for (i = 0; i < zonecount; ++i) {
+ usestart = i > 0;
+ useuntil = i < (zonecount - 1);
+ zp = &zpfirst[i];
+ eat(zp->z_filename, zp->z_linenum);
+ startisdst = -1;
+ if (zp->z_nrules == 0) {
+ type = addtype(oadd(zp->z_gmtoff, zp->z_stdoff),
+ zp->z_format, zp->z_stdoff != 0,
+ startttisstd);
+ if (usestart)
+ addtt(starttime, type);
+ gmtoff = zp->z_gmtoff;
+ stdoff = zp->z_stdoff;
+ } else for (year = min_year; year <= max_year; ++year) {
+ if (useuntil && year > zp->z_untilrule.r_hiyear)
+ break;
+ /*
+ ** Mark which rules to do in the current year.
+ ** For those to do, calculate rpytime(rp, year);
+ */
+ for (j = 0; j < zp->z_nrules; ++j) {
+ rp = &zp->z_rules[j];
+ eats(zp->z_filename, zp->z_linenum,
+ rp->r_filename, rp->r_linenum);
+ rp->r_todo = year >= rp->r_loyear &&
+ year <= rp->r_hiyear &&
+ yearistype(year, rp->r_yrtype);
+ if (rp->r_todo)
+ rp->r_temp = rpytime(rp, year);
+ }
+ for ( ; ; ) {
+ register int k;
+ register time_t jtime, ktime;
+ register long offset;
+ char buf[BUFSIZ];
+
+ if (useuntil) {
+ /*
+ ** Turn untiltime into GMT
+ ** assuming the current gmtoff and
+ ** stdoff values.
+ */
+ offset = gmtoff;
+ if (!zp->z_untilrule.r_todisstd)
+ offset = oadd(offset, stdoff);
+ untiltime = tadd(zp->z_untiltime,
+ -offset);
+ }
+ /*
+ ** Find the rule (of those to do, if any)
+ ** that takes effect earliest in the year.
+ */
+ k = -1;
+#ifdef lint
+ ktime = 0;
+#endif /* defined lint */
+ for (j = 0; j < zp->z_nrules; ++j) {
+ rp = &zp->z_rules[j];
+ if (!rp->r_todo)
+ continue;
+ eats(zp->z_filename, zp->z_linenum,
+ rp->r_filename, rp->r_linenum);
+ offset = gmtoff;
+ if (!rp->r_todisstd)
+ offset = oadd(offset, stdoff);
+ jtime = rp->r_temp;
+ if (jtime == min_time ||
+ jtime == max_time)
+ continue;
+ jtime = tadd(jtime, -offset);
+ if (k < 0 || jtime < ktime) {
+ k = j;
+ ktime = jtime;
+ }
+ }
+ if (k < 0)
+ break; /* go on to next year */
+ rp = &zp->z_rules[k];
+ rp->r_todo = FALSE;
+ if (useuntil && ktime >= untiltime)
+ break;
+ if (usestart) {
+ if (ktime < starttime) {
+ stdoff = rp->r_stdoff;
+ startoff = oadd(zp->z_gmtoff,
+ rp->r_stdoff);
+ (void) sprintf(startbuf,
+ zp->z_format,
+ rp->r_abbrvar);
+ startisdst =
+ rp->r_stdoff != 0;
+ continue;
+ }
+ if (ktime != starttime &&
+ startisdst >= 0)
+addtt(starttime, addtype(startoff, startbuf, startisdst, startttisstd));
+ usestart = FALSE;
+ }
+ eats(zp->z_filename, zp->z_linenum,
+ rp->r_filename, rp->r_linenum);
+ (void) sprintf(buf, zp->z_format,
+ rp->r_abbrvar);
+ offset = oadd(zp->z_gmtoff, rp->r_stdoff);
+ type = addtype(offset, buf, rp->r_stdoff != 0,
+ rp->r_todisstd);
+ if (timecnt != 0 || rp->r_stdoff != 0)
+ addtt(ktime, type);
+ gmtoff = zp->z_gmtoff;
+ stdoff = rp->r_stdoff;
+ }
+ }
+ /*
+ ** Now we may get to set starttime for the next zone line.
+ */
+ if (useuntil) {
+ starttime = tadd(zp->z_untiltime,
+ -gmtoffs[types[timecnt - 1]]);
+ startttisstd = zp->z_untilrule.r_todisstd;
+ }
+ }
+ writezone(zpfirst->z_name);
+}
+
+static void
+addtt(starttime, type)
+const time_t starttime;
+const int type;
+{
+ if (timecnt != 0 && type == types[timecnt - 1])
+ return; /* easy enough! */
+ if (timecnt >= TZ_MAX_TIMES) {
+ error("too many transitions?!");
+ (void) exit(EXIT_FAILURE);
+ }
+ ats[timecnt] = starttime;
+ types[timecnt] = type;
+ ++timecnt;
+}
+
+static int
+addtype(gmtoff, abbr, isdst, ttisstd)
+const long gmtoff;
+const char * const abbr;
+const int isdst;
+const int ttisstd;
+{
+ register int i, j;
+
+ /*
+ ** See if there's already an entry for this zone type.
+ ** If so, just return its index.
+ */
+ for (i = 0; i < typecnt; ++i) {
+ if (gmtoff == gmtoffs[i] && isdst == isdsts[i] &&
+ strcmp(abbr, &chars[abbrinds[i]]) == 0 &&
+ ttisstd == ttisstds[i])
+ return i;
+ }
+ /*
+ ** There isn't one; add a new one, unless there are already too
+ ** many.
+ */
+ if (typecnt >= TZ_MAX_TYPES) {
+ error("too many local time types");
+ (void) exit(EXIT_FAILURE);
+ }
+ gmtoffs[i] = gmtoff;
+ isdsts[i] = isdst;
+ ttisstds[i] = ttisstd;
+
+ for (j = 0; j < charcnt; ++j)
+ if (strcmp(&chars[j], abbr) == 0)
+ break;
+ if (j == charcnt)
+ newabbr(abbr);
+ abbrinds[i] = j;
+ ++typecnt;
+ return i;
+}
+
+static void
+addleap(t, positive, rolling)
+const time_t t;
+const int positive;
+const int rolling;
+{
+ register int i, j;
+
+ if (leapcnt >= TZ_MAX_LEAPS) {
+ error("too many leap seconds");
+ (void) exit(EXIT_FAILURE);
+ }
+ for (i = 0; i < leapcnt; ++i)
+ if (t <= trans[i]) {
+ if (t == trans[i]) {
+ error("repeated leap second moment");
+ (void) exit(EXIT_FAILURE);
+ }
+ break;
+ }
+ for (j = leapcnt; j > i; --j) {
+ trans[j] = trans[j-1];
+ corr[j] = corr[j-1];
+ roll[j] = roll[j-1];
+ }
+ trans[i] = t;
+ corr[i] = (positive ? 1L : -1L);
+ roll[i] = rolling;
+ ++leapcnt;
+}
+
+static void
+adjleap()
+{
+ register int i;
+ register long last = 0;
+
+ /*
+ ** propagate leap seconds forward
+ */
+ for (i = 0; i < leapcnt; ++i) {
+ trans[i] = tadd(trans[i], last);
+ last = corr[i] += last;
+ }
+}
+
+static int
+yearistype(year, type)
+const int year;
+const char * const type;
+{
+ char buf[BUFSIZ];
+ int result;
+
+ if (type == NULL || *type == '\0')
+ return TRUE;
+ if (strcmp(type, "uspres") == 0)
+ return (year % 4) == 0;
+ if (strcmp(type, "nonpres") == 0)
+ return (year % 4) != 0;
+ (void) sprintf(buf, "yearistype %d %s", year, type);
+ result = system(buf);
+ if (result == 0)
+ return TRUE;
+ if (result == (1 << 8))
+ return FALSE;
+ error("Wild result from command execution");
+ (void) fprintf(stderr, "%s: command was '%s', result was %d\n",
+ progname, buf, result);
+ for ( ; ; )
+ (void) exit(EXIT_FAILURE);
+}
+
+static int
+lowerit(a)
+const int a;
+{
+ return (isascii(a) && isupper(a)) ? tolower(a) : a;
+}
+
+static int
+ciequal(ap, bp) /* case-insensitive equality */
+register const char * ap;
+register const char * bp;
+{
+ while (lowerit(*ap) == lowerit(*bp++))
+ if (*ap++ == '\0')
+ return TRUE;
+ return FALSE;
+}
+
+static int
+itsabbr(abbr, word)
+register const char * abbr;
+register const char * word;
+{
+ if (lowerit(*abbr) != lowerit(*word))
+ return FALSE;
+ ++word;
+ while (*++abbr != '\0')
+ do if (*word == '\0')
+ return FALSE;
+ while (lowerit(*word++) != lowerit(*abbr));
+ return TRUE;
+}
+
+static const struct lookup *
+byword(word, table)
+register const char * const word;
+register const struct lookup * const table;
+{
+ register const struct lookup * foundlp;
+ register const struct lookup * lp;
+
+ if (word == NULL || table == NULL)
+ return NULL;
+ /*
+ ** Look for exact match.
+ */
+ for (lp = table; lp->l_word != NULL; ++lp)
+ if (ciequal(word, lp->l_word))
+ return lp;
+ /*
+ ** Look for inexact match.
+ */
+ foundlp = NULL;
+ for (lp = table; lp->l_word != NULL; ++lp)
+ if (itsabbr(word, lp->l_word))
+ if (foundlp == NULL)
+ foundlp = lp;
+ else return NULL; /* multiple inexact matches */
+ return foundlp;
+}
+
+static char **
+getfields(cp)
+register char * cp;
+{
+ register char * dp;
+ register char ** array;
+ register int nsubs;
+
+ if (cp == NULL)
+ return NULL;
+ array = (char **) emalloc((int) ((strlen(cp) + 1) * sizeof *array));
+ nsubs = 0;
+ for ( ; ; ) {
+ while (isascii(*cp) && isspace(*cp))
+ ++cp;
+ if (*cp == '\0' || *cp == '#')
+ break;
+ array[nsubs++] = dp = cp;
+ do {
+ if ((*dp = *cp++) != '"')
+ ++dp;
+ else while ((*dp = *cp++) != '"')
+ if (*dp != '\0')
+ ++dp;
+ else error("Odd number of quotation marks");
+ } while (*cp != '\0' && *cp != '#' &&
+ (!isascii(*cp) || !isspace(*cp)));
+ if (isascii(*cp) && isspace(*cp))
+ ++cp;
+ *dp = '\0';
+ }
+ array[nsubs] = NULL;
+ return array;
+}
+
+static long
+oadd(t1, t2)
+const long t1;
+const long t2;
+{
+ register long t;
+
+ t = t1 + t2;
+ if (t2 > 0 && t <= t1 || t2 < 0 && t >= t1) {
+ error("time overflow");
+ (void) exit(EXIT_FAILURE);
+ }
+ return t;
+}
+
+static time_t
+tadd(t1, t2)
+const time_t t1;
+const long t2;
+{
+ register time_t t;
+
+ if (t1 == max_time && t2 > 0)
+ return max_time;
+ if (t1 == min_time && t2 < 0)
+ return min_time;
+ t = t1 + t2;
+ if (t2 > 0 && t <= t1 || t2 < 0 && t >= t1) {
+ error("time overflow");
+ (void) exit(EXIT_FAILURE);
+ }
+ return t;
+}
+
+/*
+** Given a rule, and a year, compute the date - in seconds since January 1,
+** 1970, 00:00 LOCAL time - in that year that the rule refers to.
+*/
+
+static time_t
+rpytime(rp, wantedy)
+register const struct rule * const rp;
+register const int wantedy;
+{
+ register int y, m, i;
+ register long dayoff; /* with a nod to Margaret O. */
+ register time_t t;
+
+ dayoff = 0;
+ m = TM_JANUARY;
+ y = EPOCH_YEAR;
+ while (wantedy != y) {
+ if (wantedy > y) {
+ i = len_years[isleap(y)];
+ ++y;
+ } else {
+ --y;
+ i = -len_years[isleap(y)];
+ }
+ dayoff = oadd(dayoff, eitol(i));
+ }
+ while (m != rp->r_month) {
+ i = len_months[isleap(y)][m];
+ dayoff = oadd(dayoff, eitol(i));
+ ++m;
+ }
+ i = rp->r_dayofmonth;
+ if (m == TM_FEBRUARY && i == 29 && !isleap(y)) {
+ if (rp->r_dycode == DC_DOWLEQ)
+ --i;
+ else {
+ error("use of 2/29 in non leap-year");
+ (void) exit(EXIT_FAILURE);
+ }
+ }
+ --i;
+ dayoff = oadd(dayoff, eitol(i));
+ if (rp->r_dycode == DC_DOWGEQ || rp->r_dycode == DC_DOWLEQ) {
+ register long wday;
+
+#define LDAYSPERWEEK ((long) DAYSPERWEEK)
+ wday = eitol(EPOCH_WDAY);
+ /*
+ ** Don't trust mod of negative numbers.
+ */
+ if (dayoff >= 0)
+ wday = (wday + dayoff) % LDAYSPERWEEK;
+ else {
+ wday -= ((-dayoff) % LDAYSPERWEEK);
+ if (wday < 0)
+ wday += LDAYSPERWEEK;
+ }
+ while (wday != eitol(rp->r_wday))
+ if (rp->r_dycode == DC_DOWGEQ) {
+ dayoff = oadd(dayoff, (long) 1);
+ if (++wday >= LDAYSPERWEEK)
+ wday = 0;
+ ++i;
+ } else {
+ dayoff = oadd(dayoff, (long) -1);
+ if (--wday < 0)
+ wday = LDAYSPERWEEK - 1;
+ --i;
+ }
+ if (i < 0 || i >= len_months[isleap(y)][m]) {
+ error("no day in month matches rule");
+ (void) exit(EXIT_FAILURE);
+ }
+ }
+ if (dayoff < 0 && !tt_signed) {
+ if (wantedy == rp->r_loyear)
+ return min_time;
+ error("time before zero");
+ (void) exit(EXIT_FAILURE);
+ }
+ t = (time_t) dayoff * SECSPERDAY;
+ /*
+ ** Cheap overflow check.
+ */
+ if (t / SECSPERDAY != dayoff) {
+ if (wantedy == rp->r_hiyear)
+ return max_time;
+ if (wantedy == rp->r_loyear)
+ return min_time;
+ error("time overflow");
+ (void) exit(EXIT_FAILURE);
+ }
+ return tadd(t, rp->r_tod);
+}
+
+static void
+newabbr(string)
+const char * const string;
+{
+ register int i;
+
+ i = strlen(string) + 1;
+ if (charcnt + i >= TZ_MAX_CHARS) {
+ error("too many, or too long, time zone abbreviations");
+ (void) exit(EXIT_FAILURE);
+ }
+ (void) strcpy(&chars[charcnt], string);
+ charcnt += eitol(i);
+}
+
+static int
+mkdirs(name)
+char * const name;
+{
+ register char * cp;
+
+ if ((cp = name) == NULL || *cp == '\0')
+ return 0;
+ while ((cp = strchr(cp + 1, '/')) != 0) {
+ *cp = '\0';
+ if (!itsdir(name)) {
+ /*
+ ** It doesn't seem to exist, so we try to create it.
+ */
+ if (mkdir(name, 0755) != 0) {
+ (void) fprintf(stderr,
+ "%s: Can't create directory ",
+ progname);
+ (void) perror(name);
+ return -1;
+ }
+ }
+ *cp = '/';
+ }
+ return 0;
+}
+
+static long
+eitol(i)
+const int i;
+{
+ long l;
+
+ l = i;
+ if (i < 0 && l >= 0 || i == 0 && l != 0 || i > 0 && l <= 0) {
+ (void) fprintf(stderr, "%s: %d did not sign extend correctly\n",
+ progname, i);
+ (void) exit(EXIT_FAILURE);
+ }
+ return l;
+}
+
+/*
+** UNIX is a registered trademark of AT&T.
+*/
OpenPOWER on IntegriCloud