File Coverage

blib/lib/Time/OlsonTZ/Download.pm
Criterion Covered Total %
statement 38 385 9.8
branch 0 202 0.0
condition 0 30 0.0
subroutine 13 52 25.0
pod 19 19 100.0
total 70 688 10.1


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             Time::OlsonTZ::Download - Olson timezone database from source
4              
5             =head1 SYNOPSIS
6              
7             use Time::OlsonTZ::Download;
8              
9             $version = Time::OlsonTZ::Download->latest_version;
10              
11             $download = Time::OlsonTZ::Download->new;
12              
13             $version = $download->version;
14             $version = $download->code_version;
15             $version = $download->data_version;
16             $dir = $download->dir;
17             $dir = $download->unpacked_dir;
18              
19             $names = $download->canonical_names;
20             $names = $download->link_names;
21             $names = $download->all_names;
22             $links = $download->raw_links;
23             $links = $download->threaded_links;
24             $countries = $download->country_selection;
25              
26             $files = $download->source_data_files;
27             $files = $download->zic_input_files;
28             $zic = $download->zic_exe;
29             $dir = $download->zoneinfo_dir;
30              
31             =head1 DESCRIPTION
32              
33             An object of this class represents a local copy of the source of
34             the Olson timezone database, possibly used to build binary tzfiles.
35             The source copy always begins by being downloaded from the canonical
36             repository of the Olson database. This class provides methods to help
37             with extracting useful information from the source.
38              
39             =cut
40              
41             package Time::OlsonTZ::Download;
42              
43 1     1   749 { use 5.008; }
  1         4  
44 1     1   7 use warnings;
  1         1  
  1         35  
45 1     1   4 use strict;
  1         2  
  1         18  
46              
47 1     1   4 use Carp qw(croak);
  1         2  
  1         54  
48 1     1   474 use Encode 1.75 qw(decode FB_CROAK);
  1         8131  
  1         60  
49 1     1   6 use File::Path 2.07 qw(rmtree);
  1         16  
  1         44  
50 1     1   561 use File::Temp 0.22 qw(tempdir);
  1         13636  
  1         50  
51 1     1   358 use IO::Dir 1.03 ();
  1         9355  
  1         25  
52 1     1   6 use IO::File 1.03 ();
  1         13  
  1         22  
53 1     1   393 use IPC::Filter 0.002 qw(filter);
  1         11039  
  1         49  
54 1     1   592 use Net::FTP 3.07 ();
  1         72012  
  1         33  
55 1     1   440 use Params::Classify 0.000 qw(is_undef is_string);
  1         1830  
  1         61  
56 1     1   505 use utf8 ();
  1         20  
  1         4896  
57              
58             our $VERSION = "0.009";
59              
60             my $keyring = unpack("u", <<'KEYRING');
61             MF0(-!$R`
62             M:3J?AIQQ=&`])CYT4)W/#X;24$@-\M+9TL:GX[EY73`%+BVXYZ
63             M'E&=M]7F``MF7J>95(87_4%2]Z?#S?XQA$FF_R[+;8$/0=4=QNX[Q`Y*A38I
64             MY;EM%W68#SU8@=[@QT[`NPI[BP[>-OGH#3`E*`E\*8#9S;#-"0&$;I8W>?9(
65             MO/=>(^%60-X6^D@AR^/Z:NZ/K((A8K:>N:[7#=;V+2U>GW2LF$W0CJ?1J(_`
66             MVN>\),PLO7>_6*W\$SLZQ[XB3:J(W`%'ZBE`A#JI,G=_FL2$2-%M[Z#B.U9*
67             M0,K]:F5/DGC?/F)(2J=A@!U#E$=PWXL1.?Z5\F9PTQ?J3Z/*$XZ+<%>?SLTD
68             M;@X&.1?\OC&V2?UMDY>4\,!BR-_;9TW;*-C-8,I.##00PN/\XD8+D7VP!QQ,
69             M`A!QP;#59N=SQ#9)U"V57NC".)5QJVDEC!,]$38N4&J=[Y`6V+7K+PZ^,N(L
70             M'%`8`@1K[^*"+%Y9(VO*FW'$>"3ME.
71             M@[Q9$.-@PS+^?=*H^#Z2H"\11Q)*L\:WL5?(XMZ"GK0SO);!GZ@Q=@"NYBV]
72             M)U0"8K"8OJEV4R%/`*^=H]]_UC.73XFV\WZCUP`1`0`!M"!0875L($5G9V5R
73             M="`\96=G97)T0&-S+G5C;&$N961U/HD"/@03`0(`*`4"3(!R9`(;`P4)$LP#
74             M``8+"0@'`P(&%0@""0H+!!8"`P$"'@$"%X``"@D0[9?I#F*J?C11&P_^(CTW
75             M=A8?8E_@751BNS5U@&K;'D^MG?K(_"[?`>H%S0YM5@5BG2A:/D9HT'3/?U\Q
76             MZ(#$=`B.\,JHURIT"M'FS&,")YTHX&K@?CEKZ@_^OM$.*;AE>LS-V7I)OIP,
77             MV0@&OG_E:3+4N\/']:163L[J))9***`;XLQ8<]V%>A/NZ%.#T=#BRAE#`JXE
78             M.5VF=!IS0;BHCH9S0+,0PCI@"3*VY[V>*]$.$0R243A7K2(SZ`2>GIX-83%'
79             ML]MN)0O7D]@9#=/2EW;I^X[=&QEQ$6+I!(,[S(.-PXDLX:S@3\GO#9Q`Y(9'
80             MMOJ!E)+!.;88T+>ZU6ITRW3E!#AVJ=*\>8+XVZ6XL<$,2NB@Y@;\.`M0B!6Z
81             MDVL&4QQ>BO\HO6N\8`9@*)?NH6(^N1G,$==KN8\)LH,YX*:*O9BDD*LV;@UG
82             M=M+5S'I)ZJ%9"[05C>'4AZ_!F@O=C6/98%3M-^*`]"67W&0**@-WNN]\\RSG
83             M#[+G!]\3X$4'U'`_&G?!J,5U@IS3O/
84             MOS"G8HX*A*+I%4F][HD3*1V+6WQ9S$6X<+26.W\[,3*W"S#.QYJ>ZLX:]U9N
85             M9,_C_30=3+#:J-G\WD`X'JX\4'78Q<(A^-=\D_WPZE%NH*TPK.%BRPC+Q^TN
86             .KYCFF;>
87             KEYRING
88              
89             sub _verify_signature($$) {
90 0     0     my($self, $localname) = @_;
91 0           my $krfile = $self->{top_dir}."/kr.gpg";
92 0 0         unless($self->{have_keyring}) {
93 0           filter($keyring, "tee", $krfile);
94 0           $self->{have_keyring} = 1;
95             }
96 0           my $subjfile = $self->{top_dir}."/".$localname;
97 0           filter("", "gpgv", "--keyring", $krfile, "$subjfile.asc", $subjfile);
98             }
99              
100             my $archive_hash = <<'HASHES';
101             P$`IAK1/'QW'S,*892Y(QHOJBH5H}S8Y%YO)[;GZKP$
102             ^+'@Q[[<#EOR3!YLOVNPT049W7$>C:B+`U'(QD"0>&8 tz32code2006b.tar.gz
103             VKM[][KTE&MGBX
104             W4VW8\YND-$}}SJ>K:&1PQ]"&I2'B'WA@>J8U])7D"0 tz64code2006b.tar.gz
105             MNA!Y(:V"8<)JH;*GH\8."0W"SK"^AGOF"`U%P<$0!X
106             R(Y3G'R:4?_W0]Z[L\4H1;A*`1/ZY(FON0&9_>]U8#\ tzcode1996m.tar.gz
107             ]A@KB.+SZ%WC[W%D740$5'WZ8*P(7.K46497CNJX7OD
108             P\0,)Z7_3B:1`#%JX63KZO2AP6CVCHJQ4JKT#"TX.HT tzcode1996n.tar.gz
109             >$LQ?T8},4/8PYSXAC%T
110             ]KY>N'1E-HL@;('"0AHGC8'-BT/"@\J(Q!!#](PR$\L tzcode1996o.tar.gz
111             (@:9K9#^4'YP@O`[1L*"L/S]TZVG,)?_;/MA-
112             8%!.RF90V24VGA>FC8WFYN:-Q``M$W28*W:@+T tzcode1997a.tar.gz
113             K,ZBCE^VW6*_AKQPGJ'5&1A>`K!?ES.(+R&G!GNSF2@
114             "?G4I0H3[78@"K2`YX)>(J#!JYV(3Q4/4;$'VQYA_VD tzcode1997b.tar.gz
115             /*LHT0+AE;#6'ZCVZ6S@VP0$#G@?4Z/:ELZ%`ML^JPP
116             _O147ENUT'-}4F.NKO}LS'I:N),^H`)
117             09S8MCYT"Z}'8X**'W5G&B*MK\:#7?$)K75S6K'%MY,
118             #`2^59N!B6(9\$5:XDIZKB*P@<'JLV6%4UK2@:-SF3P tzcode1997d.tar.gz
119             $HQI06E:FD2S;'-AO/U08IXL:GYKV,2LF'%S\
120             Z&DDN6JC6`.D']B,:205L%LE0CIA!G42P*O1)H">J?H tzcode1997e.tar.gz
121             QKZ[["IJ6[7VWJ)!-S("[_M02XCM:E8CGI-&!GW4;AX
122             A]9CKZY}%ZW&_?1%}H-8[Y%-*( tzcode1997f.tar.gz
123             #FPZ-(Q?,Z7^}^4N:2U62}1P7KW;,E(
124             D[JK;$_XM)V_K+Z33J)>AEO9TM^G0D@YGI63&2F(CY0 tzcode1997g.tar.gz
125             ;>XM4,W*LTZ9B+JI./#Z7X'?8F[$GYH`:1Q1LR%/&D\
126             JH+4K2EZ1XM%6$R^`NU4Z[*,BC2@P6F"5KM[}[`2+M\ tzcode1997h.tar.gz
127             #":0$VMCE7ZE@Q,Z!P"1@"*/N^2:T"@!JIMXDJ5;!E(
128             @9QB]GO&%(18/1T4SCM)QE0'B[!9/'X>}>9OL+35*SH tzcode1997i.tar.gz
129             [X%-#X4H;7[LUBSM`/
130             M4\7'_UDFM!.Q1]'-T}B:VBKD?9\A0^&A'7)G`+I"K( tzcode1998a.tar.gz
131             1':-`"GE233?Z+^#23T72*U1B7})_?P#,?FR0%[<4,<
132             _-$XL/Q$5INX@7T'N:D@)LV:RXYWCD9}U\?E:U&RR:4 tzcode1998b.tar.gz
133             F6@N8$>[<+#8`:L`"%I-L:)4ZQO)Q0J"MG8EHL}UQ6L
134             "%;]G2:!.*Q`^+"3HE\9UTIX-"O6]%U"+'$,7?H0;$< tzcode1998c.tar.gz
135             OGT#:)(S_L&#`'6`%96EGNJ[D'OK3-LZD-H&2S8MD!@
136             1.1L+NNJR&2E2,0PPMN!:S)TMUK&'\V(G$8AI,N"W!P tzcode1998d.tar.gz
137             J$>9-;<)+Z,U2-F\KECK;>@L4U!C%MG)B7H6H>6SJ80
138             A;/YMV00%LL`^L0%QBC;E
139             3;!<]_[C8UTV6NO`1&8[)[FZF4$BKK7@9^_6J/\VNEL
140             25#9+JU6@MJQ@(OG[H>N41Q;#Z$8.D].311#CF+C#@4 tzcode1998f.tar.gz
141             ,%7V%)L1<.UQD}6:AI%FJEW4G-T;L91JPA+T`C!#&HT
142             V28})%G&$\/BPP+9D!8,A?1>O2ABCKW@JHD"4_SL`X( tzcode1998g.tar.gz
143             UUSM!AZ#D);N[IXQ9U6ZZ)GYN`I;+T?01#P>/SD:/Q@
144             HTSY\4#-5<6W$D?R74"_UK[[Z_+T>^$ tzcode1998h.tar.gz
145             B8X9%$4VK"1:?$&9;)H3!_-F5X*L`5>J*YD1W*OUE$8
146             _`YLN'QT:E\J}YBN*)Z1$>K_^A$F8WY7%#J3"*Z#!ZL tzcode1999a.tar.gz
147             0M7Z,7(`*KF1"SGY%V0;#}+U`HY,__@S3%+F_Q#}<+,
148             (W%J0QU9OZ.UFJM_Z<1OHA(_OU[(N5-SDJP}P0SROGP tzcode1999b.tar.gz
149             C}T642QR'*@$DP5P]AM)]1,*H;LD^Q(X-`3^K-;EI60
150             BJR`4,G@Z<9+E1M>ZEZC6<8O;JELN-)3IG@VZ:,`8^, tzcode1999c.tar.gz
151             $&N/VK]JF)"D"OUAU7U4I^N`.]@!0)3@UJ2K]N#;]$8
152             #0M&UN-:"]\]&9/P8POORT@I**@

153             Y4IXT]3HZBWYI*[EZ09%34OX}3D]2S#J%QN$Q#*VY&,
154             50:56X>(&I'!Z8(%L)"_C09*26BL?D tzcode1999e.tar.gz
155             'I%Q%3}}1T!+RBD4YRHC+>ZO+1&8};MH3O}_9MW}K>(
156             D%J)Q[R0!]6H184H-T"K%V;!@M>^VS?05W1+GVM@LV\ tzcode1999f.tar.gz
157             V*L0,}B.+3MP419UKZN$A_D6L].#:MC3PI?;8O43:CD
158             1A}`Z"S/%U'@YJRRE9SN?BOY)3"047+
159             IPA/8;KIQLJBG&:]B!J:LE}`/*AY,CB><'>("ATUII4
160             Z@2W8@66O+V6@0GU,49S:7U)DS^.^;+S?(PK@(<]0*P tzcode1999h.tar.gz
161             AK_%4;>J&XQ,NL[XLUO?T\T^@N._KXKOX)L59:)/?K$
162             2?%&#P.Q];2-W%UQI_2%\[!1U4OXY]EG]V(_\1J$&Q0 tzcode1999i.tar.gz
163             1"}X)FO
164             6`
165             RC/M"+CQOOS+%U#BL6&Y\
166             DJ(8Z}J).%@E_#F?7N'/V}RKCK5[NWV)+KDV&VGY*ML tzcode2000b.tar.gz
167             ,#`3><[;_M`"4^,5XKQHX&5,C[3_(J%HM?P'UH[585(
168             S:/:T"]P%M4E%]!,:ZO!URXU_:,Q!Y\_S9ZXEHJC*2L tzcode2000c.tar.gz
169             (<\&.}-1)HEVTL0A^>MC^9[OTA_F
170             F/@1W";,1P%#BU%^8VSY_NQ**\'H_C0-9.KA2S%A4L\ tzcode2000d.tar.gz
171             +I<;KTO/A5^*45]&(4KP9RJ/UI>Y.+"
172             $MPO9HF_E*&%R'\V4FV>VQ}ZT7MWI"5(UEWOW?['<]P tzcode2000e.tar.gz
173             2&}YVT"CI\+K*\0?N>,GC"?ZU0Z&(RYEP
174             BS}Y6*&G2+/M9VONR%0"6'A#MR7C??`]Z+2W.\BQPAX tzcode2000f.tar.gz
175             7#P3%J2%7A#YSM.FY2#XG'I$O6<1M`VE(IB';(0[*3D
176             6A.L+/TX(K8%M:8?
177             +*"8*,CII+E`H9A?AQ0LH#*-9YE1&]4;8D]+&RNGKWX
178             *3GE?JMMDF7NBF]3_#48@$P"%3>64X%5#1N5;@0` tzcode2000h.tar.gz
179             TC7WXM34$`?6H8*)2\FY!\F&}:Q:98PL$%/G3YY$Z$`
180             })
181             **DQ2N>YE-HJJ;0\[:)!9J+/<`4<_F8+N61^8441A,$
182             ^A90}%',RV/]O1UMEJV3C5C3NRU`W*S:DQ@ZAVI#<#8 tzcode2001b.tar.gz
183             MV/V,C9&LLT@.5M#:>B/`T.D)N<4^?%I?F*!4#O
184             6@#J6GD*6*G$&00J<:Z:Z}F$P+>VX1)T--`})[1)AX` tzcode2001c.tar.gz
185             3QU-.}YK84}19:9G)5]@M2$%A7M@49
186             )X6#$TJ`RUQBBKF;B%P9@Y`'8I}C"%UK?+HT`8B+6`P tzcode2001d.tar.gz
187             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
188             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode2002a.tar.gz
189             T.%Z>O^9.S8JS?`/23&@2M&%PJ\K-1:+_N3R;0Z;J1@
190             ;}L$L$_ILD*@"WY<_*O:F4ZG]X[&}L*F@/]801!"C^( tzcode2002b.tar.gz
191             1/6}?:Q[*'ESZ4W4ZPLB,UGJDE.C'JP3HJ+/")+WH&L
192             5/86VN'P(?}^+-RQ?MO\?`}9@I^R$_'NJTC,)X1_2ZD tzcode2002c.tar.gz
193             JR,QLT`-V>MKT3<-\@6Q3(<}/;1*$*LXD2L%J$L%F:<
194             `WN7U1E-81^7>KJDWY1%#205QE_P`N07MQ\DSI3?0ML tzcode2002d.tar.gz
195             ?UK(}H/#"%PORWZ0^$
196             -YX7B$L]M[K"8!,E[G.}
197             N/G+J1V(.++FW9+IA$%@[9AX,EVGCT
198             ._F/:VBL%G_T!U/8)K}Y1MZ^\`^:
199             #3^/+OXE@&_V/DJ\_3D&P`GS2ZV`6ZN##4"S@+%C#Y(
200             #?'KUM:?&NQ.BMY9I\U_MTY}V1RHDSO7%$M0}7M9&+< tzcode2003c.tar.gz
201             !CBY7S<9&:Q#*,!ZOVX;'I&9D7!F96K!G0"/UV\
202             MVF8;A6X_,>!%<<^L^8]34L\`9M}27K$EUQP,$)2'(X tzcode2003d.tar.gz
203             S9W}"ZQ@.+];?HJKMR6,3-7%K7>H6`Z([O9JZ.)A:O$
204             F,KUSRP?)RO$0ZD*B]ZJQ`L6;%2C0+D#J@V7AORX76L tzcode2003e.tar.gz
205             `+0}U\YKO7D8TGDOW3VQU#WDMH@.D&6>'!,+V@KN*RP
206             ?[9E)T;IQEF`RMGQTG.4+?U;83H`<8-'Z7]>UM+J3Q8 tzcode2004a.tar.gz
207             6+Z;]QTTA!ER6/Y8QT4?DZ'1X1F-W]-^&3^W^&[>4:8
208             :AD\%WF#/`}]WIGU20*X[K83+B#JGPW#8F}-U!!"478 tzcode2004b.tar.gz
209             P-,&A>PX)7WP6A&IE>+]WX*5L3?Y,}(3\*O8^>E*`30
210             NH`MY*`7A[W/DI^\&?XT*O__I<%@GP+9LM,H3/YO&_4 tzcode2004c.tar.gz
211             ["LMMYE#'#@HF@W3WKMMZSGMA_6Y"A6}@/R]A0*LC3\
212             :HJ28L+C8S3G5
213             _+'A`<`;^H'F&U:[,&^Q'7;&:
214             @,EDOQ5,9X\F}U+"@7P@.YA(Q3$D!?)4>#%J[2
215             -X]#/^GF-;R5O;OPL;)!PRKM,AVZ"ZG"-2\0)]5S?J,
216             NEU>F?]}K!7!A9DW/B1*]TMNBA8BY:H:;.K039)8A`4 tzcode2004f.tar.gz
217             %$&HJA/+)M/#>B/4_'&ZG8XDG!<;S8\
218             5TC}&[-3V*Y[QF!}L]E".>T_SGI:"(_%FGE^NG3W0UT tzcode2004g.tar.gz
219             *L}R5"A1]0M6,0`8X\R$LKPWZ&U/05PATMRL+3P!8A$
220             M+?V@C,>N)XG1XOW1HM`@H)!A*)14??,8LN-7]X*}EH tzcode2004h.tar.gz
221             /DA%)8']P1H0$F0&C,`AL<6^R[DY!*RF3H.BI,U_[ZT
222             *Q5X]:E`[5*V9<`7&"5O]$PIEOR<347DQB1]YA("`L4 tzcode2004i.tar.gz
223             `(WD0#KWDTL8NX;-U+";PR(`M@^)_NBVR,4ZI(EJ+#$
224             1!E#SX}_-56)++GFJS)G(4]/0\/9Z'N"_6-$RC!>}K` tzcode2005a.tar.gz
225             4(!D94,CPK]]!O4]\R\UWL!!GLO#E#?I!`FSBMOIONH
226             I(B<]#W}4BS2;A<}0`O9L@:)92O#3M"\+*KX5#>6474 tzcode2005b.tar.gz
227             CQCMWN>}8[*,,Q(T^MN0@
228             I^Z$TX}].:FK*KF$"*:;)>D"/@?1"4Y^@"?,+>,1RTD tzcode2005c.tar.gz
229             ^T76E[M;_9.N'.}1+KPP,CE[;DZHGC1$+]NZV[H%.ZT
230             '+HY]/EHH"!,U#4/?&BX^&9T/XNK1`7GH>X]@0M}E6( tzcode2005d.tar.gz
231             M]1HTD2U/\ZA_WGM2M6)?RF,:BYRZKPJCD2BJ!L!N[<
232             QWJ5.N`E<8#&Z}O27}>[H5&?]3$M?6G(9>%NH11X;"\ tzcode2005e.tar.gz
233             04RHVS!UC[$
234             $:H$^4K/K[9BM'>6JJ%9%9^]HX\UBCWG["LXAP?R+RD tzcode2005f.tar.gz
235             #")G:1:>2+?\9L(S:_@Y%C([NC?Z1M]JZG?C%#;UP(L
236             OL^>8SJVSR2B?>5A>+6-!2**4:;>9:+VE!
237             [};+`0M2"]\'DI!'F&@O_&P:}!N<\_6@,XA9"#K_1V(
238             B[ZV,F^;8,[105J_Z7G
239             7VX/+BVEU!M^[-)H&'US-NTIARYZ`IK-^2}T#48TZ#H
240             AGJS#D4$0[?0<35*!N>ZH7#?#PX3K8SZ?&,[_H.X6IL tzcode2005j.tar.gz
241             KU&312RMUH%H.[KEP4*]^7GPIVJK[SNO[A?D0DT/9,P
242             ;0#'LBR$M0#&KH1G&9-@4;?Q&)']MCV5T?IK$J&4QL, tzcode2005k.tar.gz
243             8[9+^VIG+D9J7+:AD6072WD,\9PS*YK-1/7P6DI}&\4
244             C1$P^RGJV4I8LYOLV]Q600D>?N*ZT&1E>$A}W#IU+(` tzcode2005l.tar.gz
245             W@+W#1`4?(R^)$4^N7[9DX+/T?J0LYM8N4WQR-#34!D
246             [LN98?,_W,`Y}[5;R"I#I?7_XH_83^*+^$B5W7*S]NH tzcode2005m.tar.gz
247             1K0M)`5<.A[VA3(Z
248             *G\Y}!A?HJN@!/EQ2&0:#SH@IFO1<+&?H` tzcode2005n.tar.gz
249             E#4.YX^HQQ)A}N.:}?MW+W+;EXC_I(Y%[D]7I5JCX'P
250             ]ZNVA1-?(TBVI'E@VQ7\ZI^HWE^H(?%/Z9PKV"Z#('X tzcode2005o.tar.gz
251             R91\O!/V+*R@:6"HMW9ECU#%;\_K07L<
252             E`H"$IH)%7]/9$QZA\-DE1S?F)@SC9I88-%}W;^?26L tzcode2005p.tar.gz
253             ZC(%^8I,2}R$XU&^+KPN#F\K$,QDK&Z*^'"!?XN)YF$
254             @8Q1T5W!IG._S)W;;QWT9+8W07[9,EU?R6VP[JN(S]0 tzcode2005q.tar.gz
255             3@;MB
256             O$;Z+}[ML/^LWR5S}TE
257             W}XN&$-]L\D"'!IU9.C`QTD;]0BUQ5YQK7P3!N]MP`L
258             ]SU(?0#Q0HN5@O!I217?UMJX+3VI^C%OSCS#N6NU+^X tzcode2006a.tar.gz
259             ]VZ+6E4Z)\)"^V,0"89WBZ0EY,AH>8V-B1XV!&[Z\%\
260             XOUW'?I7&"KRV}0V"<;*ONG[UY[,)"T*?R&/1'X8}7@ tzcode2006c.tar.gz
261             B}8VJ8@$W._U)3KK*K2/LKE!LHM4^H_}U
262             LE$%A'/>*`'Y!-?./7(XD[G/KBX>`%W'KQE>1V?YT-\ tzcode2006d.tar.gz
263             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
264             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode2006e.tar.gz
265             Z.[$%PGQJJ)).]X;N/%#T`IBGY;8}'E(AWP&<-5HA_D
266             7GJB!Q6?'5*.WWO1_,R+.L3#34I_B5D@]W;-?D6:5K` tzcode2006f.tar.gz
267             1R[3I66V8Y)QI.*466A^W/..6A#}9%V)
268             01BME5QF*S/#*OK?5?C7(6, tzcode2006g.tar.gz
269             0F4"C%,LLNEMD2:()!;-9PLX5Y8J0J+K`"\3BQ\C.UP
270             7+560Y^#7A3:/#&K!()Z:E_LRML?VZ;HFI6DE%#;YB4 tzcode2006h.tar.gz
271             ZBQD>[}0}5D]V0B>9"6?DUUL8/XDY:9RH"<-@C5-#+8
272             "}'O2FOX]UR9RR'!GP#?WN&82Y
273             CELV`-F$?+?U1:A3'1TKB??H#B;`!AS#Q;0_KK]Z/TX
274             )L`T#FB6-YAUJ(;3A?$*(74$A5'S/
275             M9L,63Z$Y![++\QR@H-NNEHH&[*'H6$R!6_CNR6-?)8
276             }T!(I:ZE(].H5^5F(JX**Y#8P>8-3#'/C&5A9!}NPQ< tzcode2006k.tar.gz
277             ,@%IK`@E32)LAY_`5:,)%7Q$1VQ`W3/CC*'QE*U!}L4
278             B([2E@K?C)[OST4N,-#K@A*$%^QJL7&)$;:$OZ6IL"( tzcode2006m.tar.gz
279             ^C]TE)CXC9CS.`:,D"/EI6O#9+7:!,C[_"IJFSJ+*(H
280             /L6'R7?".GAJ6+QL":L'OF[.\Y}3?B7+KBB!ISFI:LD tzcode2006n.tar.gz
281             KO[C!UHRFP$3/.*_LKBN1BBV[C*`MJE}A]VYA30IT',
282             :S?CSBSI$NC+U7W<2'F0(}'R[+2I7TWZAPXGWAI?BWX tzcode2006o.tar.gz
283             @M4"3/@RZLNR^F@_CKQXE\+`B.@@G>SA!TOXLC}[[PD
284             QF}_:;,Z/-I'}H/I;;@
285             \G+SJ4<#052;^V4%W1KDX,*DY}111\C:BF@NG/P+>%0
286             0%T7`I&#/M<_54QY\/LH)#"X"&Z5,*;&^(\]RR*EQ*L tzcode2007a.tar.gz
287             FF0!Y}I4:8W_\E!KYD_#T&7}&4I%G%20CMMQ\1/V^?`
288             H59(IH()IJVF!;L+A.+X/G?#?83:B9+]^ZCE}3QBPP0 tzcode2007b.tar.gz
289             (&9OZNGI-MWQAKGK_8Y]JS`&KP-}?E/.!H'MOVT(1V(
290             Z-AS^*UXV5BM7(5P0Y<*'@X@#;T4\Z^E5-*!E:I[N3H tzcode2007c.tar.gz
291             /,V'0JX:9/V9RI?]7X5L576T8.#&_5Y\1ZCF>CE1)Y$
292             8'7G.R)CLF8}V4Z0\_WQ-[F^OEH'Y6WIXP&( tzcode2007d.tar.gz
293             Q(.3RJ3L`J9"I+BO^NA/O2X+&?S&}Y>DJTS5_C8]R0@
294             T76<+I)`/.U2.$:I,&-R_0?U5S(;VM:EN/OJ)
295             E/68(PB*:V;W"S8'$\'7O@5>("YA;>8UF'[M/*A\HP(
296             9:$?X`R2Q4T<."-.\L24!M[U\SYY1G,.KQ\DO*0S'$0 tzcode2007f.tar.gz
297             GZ_/G!0"\@HI?D(9*;.G;\M;'Y[@'_M4Q44]>IB*MQT
298             &U.L_@`$.H6}9%S]ZY]M(,[L8S]A%X!DM&]YJ"R-01L tzcode2007g.tar.gz
299             !DLU(10X_Q%5:2I:4CV&*B+WOV#+^}DU5});+E>..;(
300             @S5EVJ&(:`!7#L)`>4NK6R$W>3>4EZ6Z:`6OQG/_0Z, tzcode2007h.tar.gz
301             :LRJXSUR@B9RF&Z&J}>+<#HD#\+K--'M_MO
302             Q'*FY@&Z0`C'L,%/CXWZ6)QN8?D(]^+]>&
303             5;C5L)V82N2!9\F)?;LT\'?:GT?`9U+TJS6:F`+\@8$
304             Q3Y/5>"JN4BAM^?'4S}:]V6#D/`GW$,+(.Y`@RC3M)T tzcode2007k.tar.gz
305             LBV/*G*8^!)1VZP.2X*/A,-?R19X!>]_/^&/<,T?X?`
306             6X:\AOD7?/`QE-}^AU)Y>K`(A?K+W#UGN687<[WOQ)L tzcode2008a.tar.gz
307             \?K\-4HMR'!L/0!T]%HY,?.Q\;>;>IQ.R90,[`G--F<
308             7N`"DJ5AJ]>>!\>T]*4@ tzcode2008e.tar.gz
309             KSA;C__8G-Z([[:IF:6DG%(BZS;>*NP]$+A./\N-\SP
310            
311             /R95)8>6T0NK92!;+HH@(,P/%DX!E8W'OGP:4R/+OK,
312             }1]V}:J-\-!1*@RVD$W?[:HAVL(IPX9.;_[[P/YL%R, tzcode2008h.tar.gz
313             %#&NNJP&>RM#6#ZSXQN}6NH"MKL.L-5R199@}\-(>6@
314             5&:2_?&0EV-H`D#C>RK:.<7M2:6CVW`[&1^T51<9>/< tzcode2009a.tar.gz
315             -PUP%I)[1I0W'HN.Y"*5S2)'2MP3}O&+V4QG`}FFN)D
316             ]TN\#,![&-3D\X1B5!ES$PJ1N\/Q`}SH?C4-8)VW56< tzcode2009b.tar.gz
317             *Z}0Y;V6J"40BXFN+}0.5DRP%0:V5'?-5_A]7//&6#D
318             ,12VK4$LWWI#WOC0Z7I0_I>8BG;$V[XTLU:?%W;6EFD tzcode2009d.tar.gz
319             .K)*P'^+'^&;.U}-#G61@$EZ6:B;^0J,"''VXY!Y^C(
320             D#$/8@9;E1S-XP*P9[[5F>AG_$':83/%IB@979.0*B, tzcode2009e.tar.gz
321             QF5:9)&KZ4*T":]1Z(;/#4FZLW.X^$I}MVV7H*`Q_)<
322             U6'YM$J\NMH_8\S^
323             ;69$E8O$#3;K^V*T8$Q+>\)^)P\"R-]?BF8RKLQJCJ0
324             )16*ZL48A&R?9&5'XZRB%T95>_+E*\77'E?8+
325             1W@/D4]7DAQ50#"P},W])S5(,AX-&H0EU1NQR^IS&U8
326             )62'!9;5N@S18-%5CP>%9V)'?$8[^S}7*G`7UDZT14( tzcode2009k.tar.gz
327             PRM0FP,`]O"`8&T;&JJBY28M_%-Q[K<
328             $!`UJWO9Q'8Y8.91/G(%UM$"R%-BW?3%*4.M[3G}M., tzcode2009q.tar.gz
329             @W-!V<)4;]K#V\<''LC3]OZ>#G`"J-8F5F]TW15IEMX
330             G1P"X-!@>VD&D'69_X3MH2+0$@>;A8+SG\'\D_8[PI$ tzcode2009r.tar.gz
331             *_G1P(#L[^*@59%V-E]FKW9]A1!!Z>N.V\}T)ZH7X`P
332             @W_U5PX!J'G-0*^HV.C)!I1<@
333             GM]HD2'[NY0AC}^?EZ6N%>DJI'$ZJC1[J+S`41,4+H(
334             *3&4!:)"F8>?1,@;&7\EQN8*-ZXI._<}F`Z"!);^M`8 tzcode2010a.tar.gz
335             0_*2/IJR*_@HUB7!/(C`G.D"_M.Q]G:%49K@;"EF7O$
336             W6"('R;'*49%WL\4)}VBM#PKB>1/-,D!QT5<]R_46P$ tzcode2010c.tar.gz
337             O:Z-IZBEO.<,P<]4Z#X\%A>}2-7**5^33>>?.5O}`\$
338             FA2ZX79K"8BU<([.0<>X*\:?1}6"2&_,N1Q_/I2E+ST tzcode2010f.tar.gz
339             >@W2QCOIQ@BP+M/(ZD$OW7KI2EOHT]4
340             $-\.J"D\:#`[T;4G#K+,/H#}D+F;Z&:AM2UP,%*IXP, tzcode2010j.tar.gz
341             37Q]>ZF"HK>^$^MF1Y2`!OAAGN\_L;:8*/4;J@@E[_(
342             ,9$]Y-'!55L]C>?M+$D"Q"YR:B^D$(FZ+Y/**J8PXP( tzcode2010k.tar.gz
343             -!OW8RU0"0NX[2M-WB]&Z3}>QT61ZT`TG2+UJ2'+R8@
344             6}S]4VB_&TD:*776%3:+(M}:12@FSRBO7MC#8\ZZ4L` tzcode2010l.tar.gz
345             ,Y}B8)?@L(3S+*-I$9Q*"}Y>N#1[%HQ-M7^*(
346             7XFW5J*`P%B3A&KT).G51FL2$ESC-I$,LK7?T?,T[XP tzcode2010m.tar.gz
347             26
348             W&[KR/<@'2LQ_8E]N.;D#BL48W8894*, tzcode2010n.tar.gz
349             "Q:Z7?C;[HQ[,SZ)(>*>K(4J:EHCJH"DUB.]X]AX]S$
350             }J#+>XW8F0IG/}%IF*+)7:SE>']PFGCZYV/!^D,>298 tzcode2011a.tar.gz
351             ?#>.,@!UM+EL'N-1!CDDC}.$*-?C8M2/>O0MF1&]M[0
352             J)IO5FK/BM24VNX>1[J&P[6B*&8W0CA}P!+XSFLXS3, tzcode2011b.tar.gz
353             92GZP1+">/G1$%5Z0_E.0G1(LWR?/&AHKRYC&,,0YH8
354             S8)K/A:XV%)E7-Y:PRLWV@8)_)!$E)PJE4^-FT97WN0 tzcode2011c.tar.gz
355             OT5'Q8BZCY;'MOS?%_QOV^OED@]H@DIY6PSUPR%VD>@
356             ;4'WS-'T!S`<@2,CZ@X2_+
357             CS'^:RQA,QX#E$K.)*9_]EP"M#_SCTPZA8:5/T(JC2<
358             V*S33`};*1[/?M>2$LU&V7/8[@>;]@1ZV[E[$4,R&)X tzcode2011e.tar.gz
359             Z.!K#PIZ15U7\^)A\V<
360             O#.*US:8E&0\ACJ?0/A2+
361             3^NQ6-EYG+FG`7)9UVMTU4T*CYW[1D0_IY
362             L}9-@>[#C!'\N%KL\Q]"OT)#?7}753?%F,-Z96EV5I8 tzcode2011i.tar.gz
363             PWV5"!H0E[I&T8A^\3OQ$B%KQ%\A5"OU671/,I8"X0D
364             PZFGIW!>U!0R!)K3D%^'IT?}O&]\$4, tzcode2012a.tar.gz
365             $K8+:P#;464:A>1$C(>5R/#0^^[L9K[$Z&$]_T'^PS(
366             2@L@]]9A@U0:.)[_#2J3LS1J!%I8H-EW
367             IUWJ3H4(1UVN[^]?"GIA^;1$0;TNI(5O8*T7TL)H!98
368             ^T6>N0"R\<:CG]RS]I^&?4>]RYMV1LDHD5I5)N(MRT< tzcode2012c.tar.gz
369             :-,C4\CDMQQ_;RHI4.:CY&}2WG?C;YCKV_)SV__3X:8
370             RJ'VHW0E.OF86MCE*;KFA9#PN9%)T2R$LTQZKW5:Z"T tzcode2012e.tar.gz
371             9>Z"?D3]+KAR-]GX/F:EZP}}2O-C4!)U/_Z5+5+Z-DP
372             ,G0^1Y&GDY3`B]-Z%6'90VL]GVRS%J3YF.>J^[3_\&H tzcode2012f.tar.gz
373             (M;V!@S((UG0#@33(@2}*&UM>.)OPB:7WIK[C9619ML
374             M#--09N*J0L`J71,""!H8LU)K+Z70M+SLUJ$B2[`$.$ tzcode2012g.tar.gz
375             \+}G;?[6}SPI9@&!6[K)\-&PFJ?9}UMG?5%(9GA8RHD
376             V>3H[Q8*&T&)`IB!K^KW+/N\W+^][SV%H28\^:EKN>< tzcode2012h.tar.gz
377             ?%\ZDR>KQB]6';YKUN3HJ,.5S_WE';0:5KZ0CB>BFEX
378             57KX7*+.)9*J&%B%``#(4,W/#B78.2@TF&A^AG\9*\` tzcode2012i.tar.gz
379             H!@D./[;'85;4L!S3U*_U-TW!]9<;S1X,]6FBJL3*F@
380             \K}Z#A@M?L_GQ8&%)%UQ@:L!VI"<+]R$MQ%0PPD#@L( tzcode2012j.tar.gz
381             SP+B+,7}>H]V%/?_RX44BK](&J)X]8XF]*$>&OG9\D<
382             F:IH]KBGMJ()U7T[$@YW_
383             VM\19NOZKI4?9QZ*ZA.(QQ_5`.[5LWZSC^2K_:-T^,\
384             8`)"#]}I2TY.^Z}8$+J5D?*089^%IZM*VCT"1>ST\?\ tzcode2013b.tar.gz
385             #7JTII71T^2?'1>(5*[2I&WWJI%GXB"54HRN4(!2(L,
386             Q?\+I`T-0&(G7,0KJ:NZ\S'AA&BAF22(N1U.>47L_Z\ tzcode2013c.tar.gz
387             (H9(HK?}?QY#3'GCIMG/??!-_B)6:D+'JX8SIDE3EQT
388             \PR>,.LHA"[2+A"OF}`]N;Y9YY5_'^X',Z2)%F]WB)H tzcode2013d.tar.gz
389             GU%<;GC7(<)_#DU2X(8^VV#I<@8.7[2%2278}VB`G<`
390             MZK!GW>-2TA%OC}/#>3EAFHQN@(?@1N<72\ tzcode2013e.tar.gz
391             @`%305[X."C06G-ZX
392             ;3WHF`:A%KI^0^#RR,#RCI'+[B`BN?D16GG?)M!&O68 tzcode2013f.tar.gz
393             W41UD6_C9@D577+/Y#2SAT5;J&#.X5^[NURO-\QW}7T
394             1GQ*Z`Z!.6*`Z-/[:.$Q-S%1Z-#NZ;OX9TN6^9X*G+T tzcode2013g.tar.gz
395             R%<#EK7WCXAKV&6"!ONX8T*-_AW+U1)BT23QH;UE#E<
396             OTQ5CN"#J,TD1>(Y0K*8(2&ECCPDD}9WHH->I;FBZ/$ tzcode2013h.tar.gz
397             ACT8$SG8M$KIAVH"Y#;:,[
398             P8[4(KAC'B<#)VEB`R/)3(2/.KR2;8O"@'33U+2[BB@ tzcode2013i.tar.gz
399             O4C.BPOJ(^>K}FK.Y\KW*\U16M/@.:M]`U;-X]*5T&H
400             E$E^1`"R
401             #'*N420//5U6RO[7:7?@#_:H\BB@?Q>@_-HM&H:R4U$
402             $4JO>>C*C7"B-+P/")UIG^!2@*(H7$ZCG@9_Y}RR!<4 tzcode2014b.tar.gz
403             ^62VJ.F^0([6J5`2%FGMRK@>}>[6FH#X!0Z'KQN-V'H
404             P'AKW>XB>[9.K/T;JF]M"%)5\JJDZ6>_@D8R9\*1YH( tzcode2014c.tar.gz
405             A$C-`C,BL+'}H(&A`C!<2P9M(7}1;BD@N\KM4**-\TH
406            
407             \;XMR*$!>\P/^<$/1G!]T"SZR9)<6S0'K*C%&Y#X%[@
408             2M?_@?1*]*536#C9EG\K\8G8`V-'XJ
409             MNWL!B$}ASSD/"\`895)`2DZZN3_C.>].3!L"2^P
410             -'R@75PH#HC+P-SF]`(BL],S,9PKN689@]TE1TS59,L tzcode2014f.tar.gz
411             ?#
412             7<3B/>>M[MH_%`+7@S['A7G&W\MI[8>#`XG3J(N$$B` tzcode2014g.tar.gz
413             ]3O'83Y%5[]3}$/U06&P9**)KABE7/,JY;%H.6SV`!<
414             E#_%6&<@B]MW1P*5`%I-$^WUD9S(>N:LK7DZA&YQLQ( tzcode2014h.tar.gz
415             [7@(%:'B"6%L>1F7\4VE;+DQ'&6%MPQ0.S*A'H[!7@T
416             P$PWO>JEH:$WBMIQ236BV3%GG0JDJT*`C1A;8`Y}!8( tzcode2014i.tar.gz
417             $@}G#!:*@/Z}N&,'`H[Z.OC*,$@7Z^-M];7"TK9]ZZ0
418             *4\%]-:OH$(@P[)5K1D#XH4+^P9)LNW[+75#1:2R20H tzcode2014j.tar.gz
419             @-.].NMPXA52I9G&(#9P_G0LJ-)PP_Q#"C!%V.BF80X
420             O^})05,L!Y'5J9UN2_7[WV*1C>5]-WT_TFY_?WAL9J0 tzcode2015a.tar.gz
421             V;5LCLF-D5C1#/@-\!@89,1GI#A[C.U7`?1FQ`B%ZE(
422             2\'4FPX7P*&-@`:D(]H<&YI^}&)L2I%MTWR[A>!+*PH tzcode2015b.tar.gz
423             `?5^)\$#%#3GVHAV\P"$W^^}OC:8A3G(5_
424             ^"R?Y}K3+>T2&%Q30SM_&@53V(2*+9}2F8$"'_UPW[$ tzcode2015c.tar.gz
425             ++3ZSM@YT"YC$Z>JS*32W^9%08;9AD[DJ@-/
426             }1SL(H6]XM5Q*6*W,^$'I&\B@D:?91"T+9.7+6PT0DH tzcode2015d.tar.gz
427             _<5HIH](}KEGLYXA^E/P8]Q75NB&XJ)SS`1M6@%.M1<
428             ZMN`]&,E*B005Q0`8C\Y.2MT,Y\H tzcode2015e.tar.gz
429             7/OKWHH+Y7Z#B*>VTUKKJ9$PIRP:0?F[U}6&11&D
430             7I,@JR$%6T.#YDL[G7:"P-,#}\Z$!V&9A[YG)#8!1Q` tzcode2015f.tar.gz
431             1-J#/:.OVX)C:I4WA3
432             WDU(#A"X?+LVQ%ZJ_\JFN8E#}>+U4[?19E7<%GS4H1\ tzcode2015g.tar.gz
433             ,Z$'BZ%J[QD$BJE\X8%OQ3:`8;_D#MW`Y^)&RE?$I34
434             ZO+P.$<2CI<:;96?-.IW(DOS/]4]QJ#`!D4-WC4B(B, tzcode2016a.tar.gz
435             4_}`7]!&;UK,71W5D%1JNVX_0D#6IXSGZ660C9,0Z+@
436             :&R/OHAY1\43I-YEX^/\`XUD(5HS`F
437             @3,)M&Y"%,OGTBN94;K153;UTY32]E&V"N9L%-V,(RT
438             49D:V`]_`L,D^);F@,?OL#(:GD>9R6
439             QO8EFGCZVJLI.^"D$CPB;1HR}8ACG/J-K;6G2]6%4HD
440             *@R'S].C.(CXAO4:_S1&7(E07PB2YKR^)"1ZD6#G,HP tzcode2016d.tar.gz
441             W*]A6MJ6D@Y@_[,V)3]35!AA%3WLP5;4%F'T/@O[$HP
442             ;",;"W}KOC\A}E231B}?Q:AY!T])}]44$BCEC+,Z0<8 tzcode2016e.tar.gz
443             E]"$]+"FB/[PE]RB5@@\J92#DX2-}\CN8WO})OA9%0P
444             SGTK)OP19:.T2RC,')!UX0&2,R)A[6B9"TLAJ%0XL", tzcode2016f.tar.gz
445             @X.^UM`:`DKTC9OS-72BVP1]PAUULT`0%*M?7)SABCP
446             T>#9$ROJ:,#EB6@QP_4C;>'A}E}A34 tzcode93.tar.Z
447             V0#I+Y
448             7&VY>X'M[]!SV",E}7*+PNP`1L'5T_%}(O0F8H5`O/8 tzcode93c.tar.Z
449             $#P9]X&N*+)O4}S+[\2[@E#<;4743)
450             `]WQCNO2:V`:X&S?>]%E355U5/DVLM[N6/9#!}79+]T tzcode93d.tar.Z
451             G%>'44/-V(*7_!GZ}OJY9P'P,5
452             ,N??4)N$YU&TD/:]VSEY9"0H
453             8C/Z_(/K8KZAL-K^\-QY0O60<%2I1)C`N?XXDFDK,I$
454             5(*N^X%*V)2PDHBM,<-}],@DB&#_;4>"1TWA?2'FI6< tzcode93f.tar.Z
455             _>['WQ9$AX,M]L"_6.ARH).&5J<_PLOFIC&}U24G:}(
456             35_W,VHAB&Z?6$NK>&,}#"MDVRZWDB?E>)NCO;}"Z`` tzcode93g.tar.gz
457             UHSP"W@@&3-.V!`P,WFQ82S}S2[6M;6B!$
458             _*1#?Z.U.+HQ,!}[H(___`$2[:P(%:Z\JX/Z'L/J.QX tzcode94b.tar.gz
459             Z@H]7[O0$1D(FE0'T6COG#W"T]B',RRL<3HW:LQ:@U@
460             &"YS^X-0&5PXC&2#LKFV<<*"(}MA4\A",;7']/<]C70 tzcode94c.tar.gz
461             CI]EX%GS46?,.Z;!JE+U,\N}:TPW,W?!'D141$@B28X
462             [U;F)'V*"$5J?@`/IEOR_EF9I-SNKV>HN89N%0%+:Y4 tzcode94d.tar.gz
463             C
464             +;-&YM!F?'Z%;B>}4#4JZQ7KB^(:!X+J#/$H}05@2)H tzcode94e.tar.gz
465             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
466             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode94f.tar.gz
467             C601R.Q+I2LKZ%.X`):%S85HPA8C`1]32:W0T!,%
468             %?X>Z;P9*L3H:-]661E@H`@]4CMOXWATG*[\HT]3F)H tzcode94g.tar.gz
469             3H]S/<4?5\$!]9`RS$M"$69+*Z%^QR@\.<%N($1W,9,
470             >OW7;@)Q[U4\]VMG%Y?4C\'XDB
471             $K$*^`1JPQ.C;_*C:L4VPX"^,5S.^/-"AD}$6+5*U&,
472             `CP8;[+7}HZ&AT_KF\HSN)UL%W(W514O5C$`+4L1)/H tzcode95b.tar.gz
473             M!1BT7ZMVBJ;V6D8F#*WS.I+&E,HK]?G;N[U9H2]NX,
474             0'',HHJ9"DHP0^)6HBPG;Z>%(V_\7"8J4\EH?"TBR'X tzcode95c.tar.gz
475             ^18`.?/@J:8,+Z0M&P6*U8M[U[LW#I:H:M9!H@A&G,4
476             :&I,GDPN3,;)4#J8'>D7GU(LR$45^C_8*D3C53W86Q< tzcode95d.tar.gz
477             :JV/F-C<-V}N`LA]Q\64$G;$;8!C_J>+HWZ2?^V0W6$
478             UKESK8*TY+K""*98I/J)\8\L>7R-/104(\ tzcode95e.tar.gz
479             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
480             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode95f.tar.gz
481             LIKL}.(61$@8(4E[&4X&X?M+,K#.<5A%[%"[V)M??Q<
482             0<03E<(T8#H6'KB1P[PS,C2*DFKH`AHJ!<7-*.J:SC\ tzcode95g.tar.gz
483             1#7!LTVEP;0FYMP15(2<-`5YT>YBQ<]DB10&PAW'"L(
484             P/MBQFM'}$H%,NTX7'D%5DQ*:>L8D_']L,R3)[
485             \TFH^'Z"SN>!A+44DB.>0B@!K4M'L3B)$1I:-D,TSM(
486             NZ/!%L&!YKS#Y`V1".$Q}.J&Y3L#K:PO}TE3>:&UA?X tzcode95i.tar.gz
487             HQ_C*X'3$'*L3#MUMI):5EZR
488             PNR^RQ*H>9A#TXK#"(4@\@-9
489             DK;*H#9MB^MAK1L*<8B&;$R%J#142^+R'P;T_7C'R30
490             P5.,30)
491             RU(]55WM[MS#Y6+$6@'<[
492             7X;M13S0T`B]7J0?18G)B0AN5K;R?LG8S0G5}&\]G:@ tzcode96c.tar.gz
493             %B(J?MW:0Q%ON]!(7GV(*#P/'26H]'QA>PGCW-;3$U$
494             _&EB6G8W+#'$.SR0;(
495             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
496             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96e.tar.gz
497             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
498             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96f.tar.gz
499             W5_\LD9F@_F9GC1TWW*TBA*GI#:K2#
500             *DF">7IJK<^G};KT3Z8_Y<#'C_EMS*S`,`/7C\#%_+@ tzcode96g.tar.gz
501             _NC+93_%GSW;S\$]G9IQ1FBX\)Y,^P/\B/-]_&]?M1,
502             &%@7I9&GS76SZ&CB;(}7`/MUT0$FD25P8HG;Y^]8@;\ tzcode96h.tar.gz
503             3D1WX#T-E*6970%:Y`9//<$>/?S&G4&Y<2GX7IH[]'H
504             L:R/3XZA2KF`?2V_LIJ488G4F]/K8^09\W]6KXBH!.D tzcode96i.tar.gz
505             J\U)4A\T>OFX$YC)0F;FU)U%F7GK72;MI`P9Y*&QWOL
506             :O;VH'V}(VP,1[>9K\;K\A>#MO^.6[:#\,YSEDL*QXP tzcode96j.tar.gz
507             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
508             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96k.tar.gz
509             R/1+A,DR4),)DH/["Y*',/YD9!`@/YJ1Y"K`472P7+P
510             HL^O6\ZYTHRM,45-JCT1Z;PA[X#&G"F>`SW!26BW]%@ tzcode96l.tar.gz
511             ,FX+>DZN1`#WZA_R6B>-YX2X&$F2+AWNQPIQJ%$`,\H
512             FG5VE<*AV%LC}]%8Z?>S2W-SYJU[S9)VH$F:+[P:D4P tzdata1996l.tar.gz
513             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
514             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1996m.tar.gz
515             EH1!U*N648,0\DN:ZLF04Y]%"J,6_D$4K1EI\}\G$P0
516             DC#*;W^907TS.NJ_YVS^Y*!%VA7V>QW&6Z2J0O-
517             VNM<-^9.5M.UICPV5:;UV);$*(L9!3(*'28LOR*)?N$
518             \M9A3^Y%8$]I;@P%#1>,6L$[S9XKA,04}"-HNGT_+*< tzdata1997a.tar.gz
519             -2F$!<%`TLV8RI)C+[NNG,*)}Z"G;L}]#7SZ+>_4Q+X
520             )FQM(G`Q(J7_&VM-G5
521             `.*%![}<(CG-%'9};:/&5^<2P*HR3P/P7-2_RRS1(R$
522             ]/.U}EC!_^;5B#;:$X$%,#+L'A)#"LM2&9+'%155$6X tzdata1997c.tar.gz
523             S2[9}Q35@9;%P.3/3ZO/>DRS450`
524             G(%Z1TS8#6%NS6Z?R)?O91+}P;/MX4!##[C!E]CS$&< tzdata1997d.tar.gz
525             "HA$YIA'OO0[&^N0K0F1O'#5?T%MOM};;#<[Y"@;Q8`
526             6R!UU2W.TVH2-[1UK0[6@%@^HD^[9#J!O>/A$R$9A}4 tzdata1997e.tar.gz
527             -\Z<[5H;(K`I9/0UC40N$%8FCE_C?PA'!X.\*/#A>'X
528             U0PA9L<(/OU^QS9Y29-1.6}^!>*)UO5IL1!WT>;*8]( tzdata1997f.tar.gz
529             N?>$G,1)%Q(8YD7*L-ZX$&*Z8:4N<@8D[ZO7MO,VD7D
530             VYJ.\-Y'*}&![O2'U\$9"1"<<,`,V6/>S%T46K/&.J4 tzdata1997g.tar.gz
531             A9%`&65UI%/3#-$M;`X+!EJ'I+\[/&A)25!P-9?V/`\
532             +%@@43C"5R9UV_"5^8WH3}H"N"R1"`ZYZ10"5M5` tzdata1997h.tar.gz
533             %UE;&/:"J-8#J@],ECT)@}UPFAXBGX}YKUVJPT(Z3,P
534             .+D'`Q?P\X021ABI+U^BQ/9A6'S>].L1'D1A8WUV6:D tzdata1997i.tar.gz
535             )%(/R#7$(V^(<_%>_/-O-O@R:].57,#P'^G0"``]!#4
536             WC'N#8)H6O,K%UO2QNV#BA(P9;L@E2C*6NX"3;:?-K, tzdata1997j.tar.gz
537             8Q+HC%KI[QUX*#,/F;"J\C_,A7GW;"ZX}FB@E3#BJBD
538             MAE8F@}6G`P< tzdata1997k.tar.gz
539             P!A+,O7B%`
540             >K$,-Z-X[C]*TM&98HS;(&*^*7}?7`[;UK2R}E_(W'X tzdata1998a.tar.gz
541             O'H$^0.*'C
542             SY3&)`[B?`YC?8B-BW"(H(5&X`P19L2`HT%?*Y9NY"H tzdata1998b.tar.gz
543             -L)')/BY4RP&1M51*38QB;YGULZ*]:%FO}B:J`1BMF4
544             ]M0?P_7O3+D>^2K#H?}3G-,4H$B+"-^PF:B0P985#]H tzdata1998c.tar.gz
545             _U937D;GD,RHR>@;"?GZL0').T2<(FM-?T#K7(D[,%P
546             >L!20&\FO;
547             Z9I*7`-GAHTPM`1#06>'*\\:1_<$&@P#@PQ$DH%7&$T
548             W.R8OWRZ!S];}"YX>%JE[X904.17T0X994'/}Y6^FP@ tzdata1998e.tar.gz
549             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
550             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1998f.tar.gz
551             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
552             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1998g.tar.gz
553             0I"M
554             (15Q("K7}Y<}`/6}.Z-U!G;E;+WRG\>>6':0F-."C6, tzdata1998h.tar.gz
555             T@C4[YQJ>A+O$AL$
556             +WSM9Y,0}O+;D:&`Z^,I[CD*7BP^S3[74;*U)!(K;%L tzdata1998i.tar.gz
557             R-T3W14O0<8^#S
558             I\S^L(K,
559             ,WC#S,0O`E;+
560             [9T tzdata1999b.tar.gz
561             %:?JRV;Y#S1\V8M(A$ELG@V'P%A\P\_#L"E7[B:WN/(
562             5'8$G!W12!5A;\?I#Z2,OH11M0)!1CHZ[VI2@+'}JBD tzdata1999c.tar.gz
563             CHQO;?K+#EG8!@+K-Z5G>O%'5C8+)6X@'8C!}ISX_KX
564             `*1;Q]WY3`5GY}$*CKVV.0!BB`GG^F".SWXWSA!N^@\ tzdata1999d.tar.gz
565             C`YJ53,E^X`2!(T:PI*!<4C^&5R2NC6Y>.!CDHQQ0RH
566             U2_}PPA><*#&YGQ\Z})E]\QTY**@A;U0KS}[}QJ-S)H tzdata1999e.tar.gz
567             0Y
568             5BC\T%K'7K3I4A?Y6D<}%RD.ULQXLVT?/XD5!VHM+O` tzdata1999f.tar.gz
569             1"Y@ZIN1L-.?'P-5.OY:(2P-4,Z,1?4O5)XX1M6I*I(
570             S;]IB3:D^MQ&1"&6XPO?}1}?4<$Y6@-2V3ZLM[AL-V\ tzdata1999g.tar.gz
571             /P29#6V2Y0VJ!33'%@8B$
572             J#E&JQ$ICO^RN_P/I"\*G!.L7WZT)0B^(ZRSI2.Z%*4 tzdata1999h.tar.gz
573             N.[5"H(5K&U#`'D^N^HWM_"$O\EH*.5C]80;?)-?2V4
574            
575             2`D#9?1#D
576             8["(&T?^M+$F]/'M.)H[W)/C9E/%QO$@EV-}]}^+7Q( tzdata1999j.tar.gz
577             _JR*R]:37,/DDB)6)%<<>S#@ZINCIK+X@"AM>K<-+GL
578             E[/.;1]ZYC"C}}FP%]AP.SR2WT?8I;ZH(`UL*0A#J(\ tzdata2000a.tar.gz
579             L6$2NW\KJ)YVNBDTV9.2WS5T#R:Q?>KSWL_E}>0YJR<
580             8&_UY*+I%$C5UB-5Z%J9:8"0#NN$J1[?2_MYX!E'IEP tzdata2000b.tar.gz
581             G*F}(Z_ES1XG,#-&13B'`7T}`+N,94FNREV+9X_]F%`
582             2Z>,5VQ@ZE9$86D60V&V_R\O8CSUK#\+%^7*S(/%WJH tzdata2000c.tar.gz
583             )F9O-TJ".F;KPT^7&5C:G-,]*4?X,AIT68!}[PZNTMH
584             F$?0Z9/P%WU&MF'C([@X;1P]S]?EH!M6LOM')W'&A^, tzdata2000d.tar.gz
585             56UF8TB#P]FPNZ3BVP#I\M@CJ\L+2P`/T9;/%Y9__B@
586             WJ@O^:996D6?7OM25>E+$%$.KS;"6ZJ):4[Q/OG[#C, tzdata2000e.tar.gz
587             YM%:>0QR-2IG-U.,__4E^FFPYG7FT&+DS'}B$ZI0?!0
588             G7Q)5],._6T%"3D.S+Z9>`5^RX&@:D"CN`UD@79WF,@ tzdata2000f.tar.gz
589             )-]G`$W
590             F9D4.>+XD-&3@A<0[IT+Z5<3!#'G7KF"/MY>]5U;J?` tzdata2000g.tar.gz
591             A
592             XB7Q1BYV!!D&XTO;B2L?U)[JNN_(/)"OGH.NMIMPZFT tzdata2000h.tar.gz
593             <^-:IAH`@8V60GLL?@_8M\)EQSI!?G;U'4[*
594             *$0GQ-A:3\>8X135/)/RO^RDH6/_R_AX;6?[]\UD tzdata2001a.tar.gz
595             ,C+2}E_'*1I[WF96HX?%HN962+!7.)F,.)5S][?3M1D
596             5
597             "2)`IF)WK)QM-.F3B0LC'"5J&O}W7TY$7MDBW2.N??4
598             }[PV#XJ^,]$0!'*]^";^S.4`E%M2)[Z5@,`%^K.`DAD tzdata2001c.tar.gz
599             :,GWLT*Y-2$5>(NX>D}X561`YMN(^I.J;^$V4,JEP*H
600             V,ZZE@DLB#.ZW,,8#@D_K[*0I;U]E@G;@ZI0O8M@$+H tzdata2001d.tar.gz
601             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
602             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata2002a.tar.gz
603             *!&'%Y
604             \TO_Y^$'G%B)-}$0(QX8W$B#(KYBPX8C1E61,B'O5\T tzdata2002b.tar.gz
605             6G@?R$W3VCOX5\}DY87,@B!X@,"4[GD9J*<3?$G_]#D
606             P(T@!A1:Z`VL;&<\'A/DU9'D#J"X51#,?,}IMU0,/WX tzdata2002c.tar.gz
607             P809;Q2G!%GN!RT
608             H%JAKHMJ(07G\/_*G7G_6RHL@#5YH"S.A[*I_2<`V>4 tzdata2002d.tar.gz
609             G^)?2OG*:}AA'&?GU[!35MM_*]-_I@2VTZGV'EE09/<
610             )}6O$:<'O+'GZM/7D2HQ.2Q%-:M+_OI;[H)'8!??"F, tzdata2003a.tar.gz
611             KJY4Q_:(%011`,^(TF*QSO]6KQ7N#}*FO.'0I;
612             @+C[G%UI>/?LL-,[IU0M8_/I7CNV?EI;1`5MS!!J&"( tzdata2003b.tar.gz
613             E8*K>ZZ3['JP%(B0/\D_
614             -Q:^}TSJ\MT(.E&[P5B9K>8?30_H`/-G!]J#1:8":V8 tzdata2003c.tar.gz
615             3*-1#/W/OC_YE$+]FM6M0WQD\0(G5_,'M)*,$F0&7_P
616             /S^BK_W4HKXW^}HF+IJ"::R)P".IQ*)((VMU#A@M-_4 tzdata2003d.tar.gz
617             G\37!6&/HW$G(:D5`%Z@OW60;3?RII`%L+Q@AAYTOZH
618             }ZD^9E74"-:>53>#W('K*A/"6QU>Y896MK.`\[>8F,$ tzdata2003e.tar.gz
619             JXL*2@+S$9^X%$]#2,V}H>M4,*IV
620             ,+0+\MPWAEE@&$RUV3!!U4F}Q43:!FJ;/}>1\#"/:3X tzdata2004a.tar.gz
621             _O[+P853D*ZU@<5E16N@LE/Q2R@VK_5;22(&L7X#X*@
622             TN(P6(UA2H$6'"3^Q#M5PIJ6)>H"G.F"/B5}>\5)>}X tzdata2004b.tar.gz
623             `,%G^A7`%F?ODM-B`B6&5N&!A62;@?VA-VKEK7A9E&P
624             D"!WC,>HNA:-5<2RI@}W54})>S66,0LU+B%DMJ/<^%` tzdata2004d.tar.gz
625             O*CVSS/3+2_4%\H<&E(7L;*3$LX&E(10_I"!0?$,/)D
626             ^J}AR>P:L/SU,V@X1U\D["X;0\2K0$Y56FZ';)D^";H tzdata2004e.tar.gz
627             .V"?>"^?!N/7NE2O>\TJTXS;IC7}8_A<_P78'_Z,I+H
628             )9DQNHLL$4B%]W($M@]`?%-(.>}^;)%"5>T5^/JF,I$ tzdata2004g.tar.gz
629             2>OXZ]877,Y3.H/9&4Q,?^4*2RU(F1:^2[DH9G43*'8
630             [\1JJUWRLEM*LFOCFM,B4BX)TOQQ%/(LR!L}6OC)@6D tzdata2005a.tar.gz
631             @MVM("T}#E8F).X@1!@'>>-MI$),Z.G01^&LD#T3Q+L
632             }/!;IP@BIFPB1I:P0NP8(SC}._9*FP2?)910^[02U}D tzdata2005b.tar.gz
633             G&#R^[YL6T/#J^]R&$U/%R?S$NVT!N*O>227++_(700
634             S88TM@098U.T(&G4ON;;
635             -S$-%D
636             L6PFP1\(:HK]9R?-"6BL&*BK>(9!U^#H7*O,0*-CEMH tzdata2005e.tar.gz
637             :,F92[)JZX4F)_WO1.Y@:!L3GC[Y&T)%*.T,^SP6NT@
638             T7,'^9G*EILZ5ICBC[>6OA[AY2\6+R%Q`G#*B$2}%+\ tzdata2005f.tar.gz
639             -9<#**-X5G%H$B7BL8L:?4;KF/.S+X$)8$M5`WIQ2D<
640             *P]%.W)S@&)^&G8P`IPWI(Z8W+}FULY%C^U;P.K/-}` tzdata2005g.tar.gz
641             >_4'\9RP[&H8#Z+/<[^^TJ4)3R-(-^83.1L/5}P#>)4
642             QYUVFD@Z}M-:'FM`\ZN(7119?!LF24+Q[GN<>A0*KN\ tzdata2005h.tar.gz
643             0L_<}.?5:)RAVLOU[W"1I6""&BF\&V@EY<'4'SJ%3]<
644             234)%[]K.8^#CAFB3B!NOGWQ7A8H%Z_$D6S_+.W(UE$ tzdata2005i.tar.gz
645             +#.RI\+OJ2]M.K}\J,7*B;)(#?+9},O-9*,L1Y+
646             1PCK>DN9JZ3\Q02"\/LTV>4RQKO4',<}7N+9K!+,75< tzdata2005j.tar.gz
647             :`(:.6(VL;:*#$V!@H./0`DY#:@.:A?@A1%USAC#!7\
648             _T]2G}9UXV3W?<'655[,[W)#-?^3>M1X<`.%NSR>`<4 tzdata2005k.tar.gz
649             $\`;5HH(N4D+[-)0-T"L)U6%_:GS\
650             `D:ZV(:1E}&;?YF?`:]`&I"}DU:GR?+"1^G!@TF9,^< tzdata2005l.tar.gz
651             ]XP?Y/R@:#/$-"?7Y_:@TB)E,F,\/>7R";@2+DG<\CP
652             8`H:XMG>ZT89&XP4BG&'AI:MT]M<'?)<\L5QYUZ(2T0 tzdata2005m.tar.gz
653             M'-/T;7BH#DSE.GYS$%58N/N*X??`>I`}(^RXY0U@(@
654             D@.Q"57'&0@C01W)5._E5+0'2V21}]53$^8$75((5I4 tzdata2005n.tar.gz
655             )1CF2?*H:3>1$E1%5OTBE@<8>JW'^P(NQ8U8S3\V)-<
656             $+HT2$W6:N)>WLK?<58H@$Y@>F9%"+GX)CT45/$
657             L.?)VFJXZBON09#Q$?.MXL;SA/3M[`U,43C5'A_KB[T
658             QS#^9DYGX:<>.Z9H"T14OT<;A)[MF!;Z[T>I*Y8$-.$ tzdata2005p.tar.gz
659             H$))'Y\8_V8'U]A'55[*'#[
660             +MZ}G^}?O}'F.)*@6J"_^Y;+_$\N!'GR?`TVS)6]B.P tzdata2005q.tar.gz
661             VT[/$2K2&Q])-Z}+.2;Q&VVK.'4[05HU'Q7TC'(1X0@
662             M%`@#^^E_\""HK0L-RO10AX<*'@@\:NI1XCP@20)CD\ tzdata2005r.tar.gz
663             ^/E".Y()9@FALYIV!J5&E(@7<.IU5J6L*YRR>?!+01(
664             0T?K+11S483Y`';FL(VD@)NG(/}%0>]@<8??E">1P%$ tzdata2006a.tar.gz
665             XMH%#7P:N67@G9N4E5"[KI;8__,:H2?)B(B$EBCGDA@
666             UT!&0XRJW(?\WK\QE/ZQ4L]%P#[GQ.*J
667             :S7+"D)F2T@Y`\ZU%DS*\-1I5:H41GU$EO:XZ4I6Q9(
668             E+'71)J#,.OA^R141TM>%E_0V]PX*I3\A%RW0/$6XD, tzdata2006c.tar.gz
669             WPZTL%>)HNF
670             Q%6_ZILW*&#>!JC(YQTNY9J,X_U'?IC`47S!FY*K;Z` tzdata2006d.tar.gz
671             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
672             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata2006e.tar.gz
673             ,^YGL#VHJZ!$$A2J4S8N\U[MR[?^(2,NB10;+LXJT[L
674             );VKQ_}!DU\0RJ}-)2C`#SP-6B0[K_#JP_/!8H+1'', tzdata2006f.tar.gz
675             1COG_P,W,-L)>^5XZ-,)R79S;?2C"8I8*I3-R8&JF34
676             2K?\*317-RALJHHQ.Q4R3XN3B5!&;%`O*')#!XMW.D0 tzdata2006g.tar.gz
677             Y:G!6]O8YJ*%7OXBB23AS"B'8#-H[4<[NB@`GX)(?JL
678             OD>0<>,+YM#GO5IALO"#(83.\YM1?NR#E8+WCZ}.9$D tzdata2006j.tar.gz
679             $F7_E9WUU9\]_6F"RL>N]>!'$NSBF*$52J1H}Y1WAJ(
680             2#_+@K[?&/4CQ!.T7/#H^G/JP}[)/6H1ZF,-M`@;X,, tzdata2006k.tar.gz
681             /+C_7^QJ}EOCHL-$O2_^-FNX1/4.L[?V_ARE_*9&`]L
682             8/$'B*]R199V^*RW!F}&80>S+^WV./%RI"7$-$X/\Q\ tzdata2006l.tar.gz
683             ))BX4%ZAH48%]J@YE"MBU(*FR0_@WKE$PRVQ5D'IYDL
684             TXR0-(,"B21"*>2?K;%)/\L?0%0NC)CVQ>S_^4`&@0$ tzdata2006m.tar.gz
685             `'
686             N?4]H.GN8GSX}'"$}I:^%_IPB))NBY>'(8&`Z5)%4:H tzdata2006n.tar.gz
687             K+<3?XER_(}[>]6#526UK6}_WN>&L1Q
688             R];IVH,&&;[2)^I0-X4B4G>*[8KE&UXQM+TX[1&H^-X tzdata2006o.tar.gz
689             I%D+W.22&\0QIG".@FHF<.D?<;>+7J>#6XBD#O+;}7D
690             GLW:T.")MMDP#2(7+FXZ`$NZ+YMF,/(NUZ&Q<7@\J^8 tzdata2006p.tar.gz
691             VM(A'&GIQ11&/R8U^K\72K.[U+_;6*"ETFC_$"(^DK<
692             U12QXAJ'R_(+'A87O1/M(!+-X9YS119.KP?:-5H1\-, tzdata2007a.tar.gz
693             M/R"1ZYKQQV4HPU&$'Q;>NR/%DEJ8U("5[;(X%3XS?H
694             [K)H0,N0_YU@2O,E/O!;%R!ADZT<4#[.[:-JV18N4'\ tzdata2007b.tar.gz
695             K!W@Q6:5?201L)>^&3BRIO1:/E]0.-X[E.Y%\:B!<44
696             YZ*Y\L_AL*P0LP5]L2&O&M&X3DHC]!8W9D#1[QF,L#$ tzdata2007c.tar.gz
697             J3.L]CD4/E+RQ6J98F)FG((T;TX,CR,/M^!O_Q^^DY8
698             }-P$>19#@2"GF?VH#):^EH2"IQ'\?*C}R'+8M$Q"P%D tzdata2007d.tar.gz
699             5H/->R!8(ITT7_3I@W?)OD2}5U/D"Y2?@)HAC.'ZG:H
700             F*+]3$2.5_%BO\X&AOD6$A_C"+:[0}7\,.L_^&D#\XH tzdata2007e.tar.gz
701             $K"R<20)>9BS$,9,2CR1Q4]\0(HU"@DD8:R.NXJ8;04
702             1VT2$+1.@NV,2##L8+O!!&A',T)64U_!\Y3&O"]/NA0 tzdata2007f.tar.gz
703             ($AGR}!34DV1ZX8B$}5E*\A]N`Q9&]8ZZ%QIEB$GT7@
704             &,VAF'F2GD_]Y0X,Z:'P tzdata2007g.tar.gz
705             -U..)K#H805PX_QP'K+]30<'MVFV<)YO^-1M}!903'X
706             LFWCC/"#2V`*4I9BIU#>:!Z?Q\%[3']KVG24E!UWWS< tzdata2007h.tar.gz
707            
708             K?6SOQV^F#}[GDL"PZ"F_WN4SXO[?`5D"1,Z+X7XUS$ tzdata2007i.tar.gz
709             .PF]
710             QWK.T8^(DUZMN+FW?K}8VB-12(MWA_?Q.QP_4C%@.VP tzdata2007j.tar.gz
711             ?;1\RH&;](C#R5_K]25^N+]}K#%`-'ZCAFY,09_1J/4
712             D@4I;_%FZ/6-U2`;^:[9]Z:`!F'1C"V]8?43\ tzdata2007k.tar.gz
713             V,`!(`:RFB#Z_%/}:R>`P$ZJDA,,$MLB/ZP.#%39/.<
714             ,-VZLY`#F1TP?E.`K%<+Q3UVP(5LN4?:I4.;56*.Y0X tzdata2008a.tar.gz
715             6F9W_15TBSC
716             MQ\L*+&O,J,AV\L`7`]]+EEDRH:F_R}1+ZR7PZZW(OL tzdata2008b.tar.gz
717             TW5^5CWB.3^;HPT<*R_8B??COH:<@CT-?G*D#
718             \_6A*GQ3CP"!:S)+MH3(22#1>P}+J106%AP1JD.HI@, tzdata2008c.tar.gz
719             #0S*GF+-B;66>."J%7*27?2*!(X7VXA$)6VQ]&$X_-T
720             8Z4KHNK9G+"E5J;/<2D}?FZ2AU^]*.5@;8[-;]R*UW< tzdata2008d.tar.gz
721             BK"`9R/&?M[X
722             ]1(:HM17MJ%F.:P1(!]U@W)HT#CY3YJ'2-4W6'T7'K4 tzdata2008e.tar.gz
723             %PW]-WOQ0N:F`[2J>D%Z!\)[D>#M`G7A4QQ1FH%)\0$
724             M,'BEY5(&(E(%`H'%@+"JEWS@1V'1[94<8C94/<}RK, tzdata2008f.tar.gz
725             3_FR*4O9H?F$_Q$'#_LAX0N'OX/WX22#V&):>$/6QOX
726             W6>A)NY\.,_]L-1]%,RF2&)30@( tzdata2008g.tar.gz
727             XD*$C0^8.Y:$'4CVJ21IN*)QN"L10U;_R35HZZ9PH6H
728             >19LX@MU7HT:341).X<_3L,I4 tzdata2008h.tar.gz
729             3.;-)")%M7LOOMM_%382EGGF$SJ@0$H@LIJ#*:P.VT,
730             >U<[MXBA_W(``9T>D%2H#1$T27X6GX'+G1H+D@T#A:L tzdata2008i.tar.gz
731             L[*C4^I$_$\B1N`Q?1Q')JB"G+LJ<-_WU#/4IG[M:Y`
732             [X`L&)P0[;Q
733             R\F5HE-G7@6IP<3Y(%?U#_`;NC
734             "NF\86`/N!1/$.\0:S@S@?TL_I7TL<-$[E8?.")9IV$ tzdata2009b.tar.gz
735             3.(#+U3]Y:`/L_[)S-J"O)U3IL4QTQ:E)5DX`P;]?2H
736             _A$"8W)'#>Q+F87C:C$B82&;F-&3QAS`4\^%?#MWR^P tzdata2009c.tar.gz
737             /X?YT@VB];Y&+A$[BK^;^}2_<`NX9ORUS/4IWF.NI10
738             *%Y?"N<@#ML2A#*D'R[^U[*(85[S0J@;PY?@''+]6(( tzdata2009d.tar.gz
739             \;OV^R[LDT*[G2+0/.W7P)@TZ11!4J'F*+'FA%RSK9T
740             VU]2V#X"9JZX`86*W;<(_LO}\AG0>-}<)PQ:(T7NO28 tzdata2009e.tar.gz
741             DV:XP0J_L6X4X.<*O!L+XJTA)Y2EEB;P6Y26;&BP([4
742             N1J+L8}.6(1F1@Q"MYS8"&,>3/}YW(B4(%.`4GF0 tzdata2009f.tar.gz
743             _W92&R5J-VW2PY8?SA_02'NR0$!5C:I#0W&T_YFPM5P
744             M\_3)W][;5BP%)F?<@VSMB1EJ[_*Q9%D;FI&9`,EW?\ tzdata2009g.tar.gz
745             T$F#G6L1I[_*&,"[K,UB0XXM_>U8]TS%X,VT9`0CI^0
746             :YP&64E4@(JSDN8MK+GY6I:$Y<01D64W56&HS`[26[0 tzdata2009h.tar.gz
747             KMTWX9>_(O+$2'A/!;78]
748             -$]:$AN`'4:DNK}6T"-XY:*&N%0%O:]NY[R`4UXJS,P tzdata2009i.tar.gz
749             >YE)J*HBK}?$`\\F48Y%@6&ATF5$8-LU&;N8;`\#0SL
750             CTEVCPH&:8&V>]ZWKY.H6D!_Z&:[3%B3O;I/KHQ^9X4 tzdata2009j.tar.gz
751             \%IK&EO}6:'*Z*BG\9^L",DG(;36}Z_#QE0-V`-4"9X
752             PA>,4U`+FMP?GD]!VGK>KPCBW(W+3[( tzdata2009k.tar.gz
753             )04'3-X\W5}NB[Z9(1UQ;<^@$%/;>YIC}48&5OR_^#T
754             A*"@Z,1VG5#%S;H
755             [''#H!7O'OER;7DP*;IUHW
756             H[K"*}D"*P,DQ))C,F\^$ZK,(AI8T_0@K0"$92T!_K( tzdata2009m.tar.gz
757             /WB&"WM\8`@-)C6?@&M+SNZ(8[\/ZB)>OLB8\_&^3%0
758             08W!\N,3STG[F$OP)WKUE]/EXA*)_M7]^/;/DXQ`!3\ tzdata2009n.tar.gz
759             $^YYF/`,PM40'2#Z9RAE6N<#Y1%Z&%OJAF13E%_-._\
760             @OP0B)LT*M3_1#+6$#XDNF.H"I`B8XJ:M;Q(4BR%4#` tzdata2009o.tar.gz
761             Q6Z%Y,[L3OEK9-#}.DFWXPS92RD69L)F}0\}S$5C/L\
762             ^/G9$!_/^L8V#,#$$4CC@*@F5^6JM0[,E}AV"[^T&NP tzdata2009p.tar.gz
763             C4D%0T
764             +AO;>S)3G3`>?X:)8M9SA.9S)JDWT-JKPD9>K40MA"$ tzdata2009q.tar.gz
765             I@!#C04A`'+9J0GNR.}M`FGM]^#5$02YO#9*!V-J.T`
766             '21_WK$R:&Z7;K'A;
767             /^!.[I,"Z`EE%9)S6.T:?1V4->L;J;+@L'A'S6KH_%T
768             _FJ5_/HR:@-L;}6*JF8B<}!?MDF5[>[E5O6*S"U5&"0 tzdata2009s.tar.gz
769             ?UW)-YCO0#RTO3G;)-X'NBW'4A`+DV
770             !,KZS9<@)HQ*5!ZKA:J(H-5((C)07GH
771             WTDT-TU`,W\+(>J1M<'`V}`)}`:EV,/}N9^[:Q)HE/8
772             LR()WC//2]^-D[/\CHY%4@+F2?:Y!V7K*3FP0@+C5HL tzdata2009u.tar.gz
773             @K*:(ZZ;XMZ^F:6.'#HH`C]#,*U
774             SC!5JB-/B\539RIIE.H'M$WLC%S}}}+[:PF^JY9M1S8 tzdata2010a.tar.gz
775             ^U}H@R(/G9WNOI?KD#D}^N&]IM:$'G>(V*HB_(PQD:<
776             \%%`2}1RZ$F`*6@WDO&\[1B6^LZ]
777             '[`\)#1HWDF[5#41G?,KIF)}1E:9]Q}N#X&0:X!XYE4
778             X7W;/SDX?QIZ72WN}?LQ45'B2(*R;KMXSZMK"3K3E,L tzdata2010c.tar.gz
779             ')J.M``AE98./-?0BV-}S-(D5P1/#BI"5BM0?\*RXI4
780             AN2^OF/V?^"L1JT4F!JI`;,?UV6L-7*)UDR:LRS3J#0 tzdata2010d.tar.gz
781             `FZS)XR%Z4Q4^?I]@Z.<4X[#`
782             #-N]RGDEJQ^4GCOM)_&YB$.SS?[]IYPN:ZXIF&9VNU` tzdata2010e.tar.gz
783             A\0QA`R<4U<66A@S7#>;:2VUSSW,3F_NRZ]UXNF7-7(
784             0E/<0\^[#5%>G8>:A3
785             J`8`S(U/P.>6)?#2Z:FG4'\9.%7U0_GUTEM+5!'@UTD
786             3"B@O
787             ]6E:V`GM3`I1MI7.Z3W9C)4X;]AN!S(ZE(\;FQ_-B%T
788             1GY5+RZFUXA-E\>5ZEME[R
789             VQ(D85;`
790             50^28+YLV8Z#5S?K^B601P-"`5XL.!,];@5U0K#[B@\ tzdata2010i.tar.gz
791             H`K_CX_%MXTZNSF(H^.SM,'%"'\(TWDD9)15'
792             $}[5_H/01&BS"A+G,DZ-:*PI_#Z0(Y33(U0V+3>*)_( tzdata2010j.tar.gz
793             #QP7FZPF@O\,!,:-$^>(6JP+B3Y'_VF#
794             !;E/\'JY>P@!E?%W%1TQ*_;ZA+(PCEJ)-/.6G}^Y:J( tzdata2010k.tar.gz
795             (-P#&S5%1?*UHY}D4S5]D-@>N^!$@,D?)#'O}EB?$Z(
796             .TE/F(_5UHO(G&OQ4*?@MS;O+-7F":)ADZE]0+8WV(0 tzdata2010l.tar.gz
797             %EF^`-J3:,DWYM,C9WAG"@A",.8_[-VU',3*:C+J(Q,
798             ZRTEO&!(-B5[7Y9I]9H7&}VBES0<&'2'?'62@.98MG< tzdata2010m.tar.gz
799             NOR_E@$3-^K/]KI8I}SR*5S;\^T&Z^7%(YI4%RV@5CP
800             KOHD'7VY0_,ME%QYX]\%0;??^GHW,`0WD6(L;>7@KC4 tzdata2010n.tar.gz
801             *FC%\!_?:J;%]#$4?*ROIF/+3,[4Z,TW#O9^/*E2ZS4
802             XIR$!#A4REBY"^N)JI7X9,K]8;N.V/!!+AE]W";BT_0 tzdata2010o.tar.gz
803             P0^N}X:_[,G}A1M#(17TTAT}UD*RHDU9J8BTX8-8",D
804             FH&%S,/KWKZL$2!T-``RZ]J9B*9(2
805            
806             S}Z?5-5.S'%X2+5[V4G<:J49D*:P9\YW_)@NX52USFD tzdata2011b.tar.gz
807             \EE5?&}^"]R55-(Z^N'UMVV^&M3N`>6
808             ?1L17[Q.O!9F]SZLE,X*3R^--<.QRT6%}FD1^!`47(( tzdata2011c.tar.gz
809             LL7.`F%9@\U8T1D/;/1+%O*KDK4#.)7*S(
810             +:Z}GT&7"N^?JKYG5[]09`BAQ[M\,Q$?N?GVD>*FG
811             09KW77(UL,X`TIH!-3)*._3PZ.#XZA5599`ZER
812             @OJ^90PI:"-)!IN^\N3OP_W#GFDLERD%QTU/ID0$"OT tzdata2011e.tar.gz
813             .U_`:AE'1VB3BY2&)9M\6
814            
815             Z[7JB).D[/[;2RH,%'O>EJ8'N724Z:)N>OPK0$}#A$$
816             OAGQ;O"S3R9&N);*#-0V5&:V<\SJ?!B/IIAK_Y<5KNX tzdata2011g.tar.gz
817             `!@WF*M3/#C1G^8-/L5D"E*WG+R)O8+J:6?9)\@.*C4
818             ]1>W6J}N$>X,D)2Y>W\}0:$D`83?B0!&WH&"W.'K[\$ tzdata2011h.tar.gz
819             N._[>U]@<"K#&ZM9N-G.'(2X(NVG7)5D#&8B4I7'$7X
820             !JO,PD(^3GRA8K6UP][CRK5&*G2U/]/$,SXMUX2X(_` tzdata2011i.tar.gz
821             SALXB\R7^73<)"1'4,O%-Y_EB-YMI$"[%*0-5N90"0(
822             3WC"E)BG}M#7?KOTNP:8YZ<\@@;^%-"[STFSL#+C!$0 tzdata2011j.tar.gz
823             <7T^0V1O"_PX;9A3OH>EM;6J%U.;@;ZXQOETND7RL\`
824             GX>Z5\H"9VEF(E
825             H}+}:-W3@B^4S8%Z/G`G?FZ>-'P2JGB%,]-JT*T#\.P
826             .}DE,!UDQJLG@E(2W_T.P#PY1`EN]'DQB!6HX?-BR$$ tzdata2011l.tar.gz
827             33>M+T\MB??:W'"EJ[B\E&_T9H4!
828             ^0}U.N`J&XU5Z`T#STPB_*K%Y`.IH[A3440Q(31!Z6, tzdata2011m.tar.gz
829             (('Z1/`*SF4Y[,$I;T5/N6NTKZ81%/^\6/1O@N^+HL\
830             HBU^2$5J*34"0SW,RFV2';CW#6QN&*!TF6S^MT4TTM\ tzdata2011n.tar.gz
831             W_&7MZYZ($^BQQ;2>M@\#RG[H[WMX`6}!0>M/T$7A)P
832             D.5XWUNZ8L.7X7";SAPF."IAL.JZL tzdata2012a.tar.gz
833             "//P?@J_}})X(0_)(W-$MF$[:P5;[?ETMU0WOZ%3O:\
834             (X$U2'K-XX\U+E6`6UO)L]N3V<"/VSS[IHLV"
835             Q#8P\+\9<[-H(IQXC:D)9}?(L-;
836             X>LARN!2@M\NNF[)ID?%/`+]DOZI']7+DX58"#A^4KD tzdata2012c.tar.gz
837             `O2N7#IH76B+[<#!<_3NU1?/^`&.'\E.[J__-5R0M`T
838             L_FE*)&V:6#.*-XR.NTJ2QENDS\@K[^_/<]X>K#A8?8 tzdata2012d.tar.gz
839             9JM[SW!PH*;9NBQ>^}7`\)DD8OI#H)F8HVR:9`2;$!8
840             3[:_<]9JM}+[N0X'JEY.8V(A)FIIMUD.S/S6L:S_O9@ tzdata2012e.tar.gz
841             N-M3^"EG1RPZH9&@3PJ71SU#,<
842             $H61?C];;\>A9J.3<9$V4%`?ZXCK_$"\:F3C.3T.K5T tzdata2012f.tar.gz
843             'Q.A`DU.C+WP8X>M%1X7G+[+"Y7WWW[;P`_47BMV)WH
844             I-R0?U"@H;}3@M\&7(I,`"C]LGC2^.O%3O\)XBC->I0 tzdata2012g.tar.gz
845             DO'>5<6/;CPQHT/J.9079.PW?6+(?_T_M\*IO\*>:34
846             >Z_)RV-;?(-J_?0H/!$1_Q5#I)RD1$Y?.ZEKH?QPC}< tzdata2012h.tar.gz
847             X@^Y"3PCXJ0.L1$+.BGZ);R'"U3.KEO"4]G]&P_H1&L
848             WGTHO##WZF^:/\7HZMR>^[MX4<+W#B)J\HTY-)(/?[< tzdata2012i.tar.gz
849             F%%;DB:*+N23AO:54A'!2Y_D}&"Z'#[%U@:!L:DT:(P
850             />1%+X]U?*.FDDX5>$6%EGQVCGR&OG,#>-`S+"25A/X tzdata2012j.tar.gz
851             Q;!R1B&/7#QU&WW<7$[A)T,OP9&'`9,AON_UB5EJZ1P
852             361`"F.VXS7/:C!D.HV
853             $C},NF^7[>3`!:ZH$8^N0R6,5,NV_)M:DU
854             74AV&A}HX1)>)_4WOPL3KG#]7)$'W+RPKY)I7Y4][JT tzdata2013b.tar.gz
855             GZ_':K,7}G(SF@Z4\`@_`?B571;TF/S3T5Q^+T-O?YT
856             FXTC3C6YK/V>I8Y;^NS,HFI8#P28X'1T55R6.S'/;>D tzdata2013c.tar.gz
857             W$(@R,(1/8F;B0%6&A,UZTWC&(%B+]>/)'#&)6B>_@@
858             U05UKKDGUHC]721SGQUD(BU`(A"1_R7YK6&F7PR@.}` tzdata2013d.tar.gz
859             S;HAB^/6;&6B}T}($JN$J#,'5O84N!9:RS)@$W'H\2@
860             ):IFLK%R;TH;HDL&&+I-8MJ:#'E1249OO563L]*F3(T tzdata2013e.tar.gz
861             2)QCAK.2:\U<)7[[_?Y/QBOO][T##BQH;'WDA7V+BZ$
862             /0E2(UBNW&PR2@W%U$G@V_2.PHFEZ1L
863             A!!]INN+O)!CL&Y"+K;O2EE2`YN0M,AO;,;,[+-PT4@
864             +}WXODCHBBXD0K'$ tzdata2013g.tar.gz
865             3UA.2G%R88+IS"\3NNHO`K%?3%8#65]DDS&*.2"0,'0
866             K0L'.TQOB(NJ,_9(0BH"8`IOV-,T42#T7:#UU44_N-@ tzdata2013h.tar.gz
867             9Y9%@WN4#`U,8\L'#B;`0D8:4@RJ7[X>T2B7IK^UQ$`
868             -2U4J>'_N+<)BA#}GB\SSTQOG+"V_(3`W\.)A0'.0(( tzdata2013i.tar.gz
869             D4DZ7JA;XMMC-,<}}"Y)#A"8EMXHL(]J}OILTPP#[;@
870             M%PNU,JR5$9/'E6:KR*Q4S]K-8)QCU84(107B$;-6I8 tzdata2014a.tar.gz
871             CTB$PE}JN1W@8NUB}X&+(@[D/ZR^5R'U'3.IG]Y;/BD
872             F3;I35>68MV!,'89GOHTC8\F__'`:Y(%6P[[J8P.TB8 tzdata2014b.tar.gz
873             IO2M/Y48J.0*HQF2:NE!3,RDQ`C81N/0`"2#E9RU#}8
874             XS8Z>HPY\^<&WVSD1D^*9NYK36\X?L`+!JLU1QP$V[< tzdata2014c.tar.gz
875             47E*HK`/$27UHF?[C?[]!}^26B.+\Q}#`"S'-GH]*[(
876             PK}TM,Q0JG7YT*CT;*A>W1%/G, tzdata2014d.tar.gz
877             H`<;@0%/2H(RDU0A,.VW
878             ?%#D^CGON/!*BOC<5"?VRB"XHNE.4E(]P2A49@KP:+` tzdata2014e.tar.gz
879             J',G03SUWN4;1SEJ2)2WTO#EX!2CW_3W&ZJJ\.QG'NL
880             _KIF2Q"-(<^Y}U3ZQC`;@G1-E5$CS?D"%GA[W)L11CH tzdata2014f.tar.gz
881             \!GWNBM5C2ZDA7IJGX:A:Z[W)>/PN#U3[`W#,"TM'HX
882             IVE7UO$*5&/4O0.OW.LH2!'4X96#L,+_@3PC;P}?)8X tzdata2014g.tar.gz
883             MT&!*_IV9H5`<_FN[Z1V3@EQI
884             _^:"BX,'F6:3]U4>->X_Q#-,-A'K?^R;4I"K[<@W@]` tzdata2014h.tar.gz
885             V(DW`\Z_HS
886             V#Y.$UGNPZ}RBTZ__23I$A%ZP?}"6A4,K4TSX@`SQ`X tzdata2014i.tar.gz
887             3"EYOCJ6^1^%}C!.R075<;<]\(0L@P#!US%X&;1:L^(
888             F4CMD1JB9;$J2M6'U
889             _S;^M#"B%YT1]L9$D4;BCDME4\8C0
890             BT$QKW7D0+1&<0G)[;H3XEW:]P'R_.NRHEBTK)M7*3P tzdata2015a.tar.gz
891             }G>"N'YBJ/>DV\KEE}%J5!E\G@3*ETUP%M$?D.NO)3<
892             N`31$?($KY!2QHU&<*_@KPKYY;%0AGHU?\&9NU03:-` tzdata2015b.tar.gz
893             RHG"!!R$(.>Q5&8.(G(1M@NB#HUPMH<+7`H4F#C%B-$
894             ,&4@*Q)FQ9RO(JF}\CA]J5K`0$FY[+>3G-0&Q_`'ISX tzdata2015c.tar.gz
895             -[6J/%X-8!R+(/K`C7)GPYBH-N09#OA6)}7H:H!KH;H
896             SK(Q6Z@:FFR%3JY/SD#IR/D,]:VMX_2*U$/W?"(}B8, tzdata2015d.tar.gz
897             ADF!D*(,7&>">J}??IQJIL&}6*B*<$)
898             .&ZRAG^D5?S\WMQJ$%K7#[O
899             V&YLGDQMG-7>,'8G(]>I"L:7_NMMT?!&2?:C7DX}QC@
900             )APR!FVTKJ^G9ZPSG,T0##C}X$3.K}8>E
901             K7W@X^AU.&'28/#\O+RC)U%J3<@F]V63<*?[EYYA5/$
902             HFLCTF":SVX7D,C%G:"W;$+TJ4OS84"<%&#VJ/^F^'D tzdata2015g.tar.gz
903             FJ7V&G.OI0<-^QT9@I1})HZH(59CT,U90A90"O\4>7X
904             I5D
905             ;3`A6Z,HFEN%IC+6-;}J5,/`C9?D)M:]B?@\3OTE+D,
906             E963LAS*G2L87SA%-8D(E&S#"#9:S+[I3Q)JTP5\^#@ tzdata2016b.tar.gz
907             `^JW?(LQ}MH}T7T}D&*Q40-K`}(D\>2V#S2BVVB9%00
908             ,?-/39\Y929(JN.E4R;];X76WN_C\GLVZNV>\Y[3]3P tzdata2016c.tar.gz
909             \;ZQ>3Q,?1CRVMKTJ2BQ1V]FM`"]H,A[!A5<#}'$M*(
910             :[+S?<%Z-G:BN^G!YQI}BR>A<<>7J&1DL+P-$ZO[+YD tzdata2016d.tar.gz
911             VLX/;\AZ
912             ]W9G;%1\0O%-[G\>CBA
913             !'+Y46ML/8/`I}"5.E4U],2-FY%QX27U*!B-K%$O-58
914             O!@%MP*<3T9Z$BR\X;ZTZ`3}2N8[)9E2WCNR%_CHE!T tzdata2016f.tar.gz
915             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
916             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata93.tar.Z
917             B_U+6HPPV]^'/H7%1Y#W+[(}KPGP'Q@4
918             61A5*V'*IGK<6CP}T2["&>62E?G'%IUXHG;C39(_:$\ tzdata93b.tar.Z
919             $^<@A"D*D:!U".7!7?Z1K.
920             K2E>KRL!V.9]N3WP$M>`*0:V'X<[)\(:L?4]L]6"4YD tzdata93c.tar.Z
921             F!]4&XCG:R-_O+ZK$MR?28(NFZ0Q.J6[1*A8>,}D\#\
922             G}?XMB,""B8"7.$MC3Q_D1X8&OXI]DNMTI@(`C5$':$ tzdata93d.tar.Z
923             L4AXY>[::W7`
924             *3`>N%_X8'>@?6}L13GJ/NB50G"0FS}
925             T.LMG-V:2Y"G??QG72'P5>%G@-XUJ?.]F8>}!IG[V)<
926             -V/('@H\4`DWY;UM"&}$J,SDDHS@DD_-Y\!!,$WP";< tzdata93f.tar.Z
927             V/,C#A;3+F%HL-$&KF0W$K^`B+LK6/"XWQ8YJR]!>AD
928             _[WT"BS['40P#PD>P3ZM"'$\+WF-?6[*U'\N;9B1H2$ tzdata93g.tar.gz
929             TWT\F"YH+HL1\6L%(.\)2XAPG#J0W5EPD1W>TTQ@&64
930             Q#I"WP\@Z48F5`:#C9ZBTT tzdata94a.tar.gz
931             V3X"B/MQ>V+Z^P]\LRGIZ0@AZSG&8HBIR@$K6"RT7F8
932             H?:Y(+Z!6_-MZ!_MY@%0O6W,A-R>$/PYP}\*'2WQ>U0 tzdata94b.tar.gz
933             4Q5*'`0U7[8T'PB!ZK0TLQF"A8D>(2@U+0\\
934             HJI9PL[@OZ(PACO-DE%D9+P>IP27ZT[ADI^A*&.`[;$ tzdata94d.tar.gz
935             !&26XQE}R73F;Z+N^EZ6[WF'Z99']C}/[
936             %JRW?E*V"8ZL?">,+<9-46(2(O]QPH}2\7O1_B0CZH8 tzdata94e.tar.gz
937             N@[B'6*E*#`_S?V\9H'@KCL/-"X2@-_T4BB_$ZF92LD
938             &E_U6&'R'G;/96WT<%@}>B>}9P)E-$WF2Q$U*^NV^W0 tzdata94f.tar.gz
939             \S"*"*"]S*(4J*?0`!?JK*J3VB$K>:H'*3I+B2,/,/<
940             \HFZD[/9S\^0"^>;YX:}VM'@6V'<+G'?3T7B@8"GI>, tzdata94h.tar.gz
941             Q%}QNT@"/22*!A*Q_N8:89!B2}R
942             :P0'8'B\L@YW5TA?5N&;&5/`2G)D\YU:#4&VFSNG0I$ tzdata95b.tar.gz
943             58M_*[QVF[$TIHIH]T&/II@8'3,X;8**ZGC;C}V5ZB\
944             ?D))*MLAA1MG/.YBV8\:4GE'D/\[NY9]L<9}<9'NE3H tzdata95c.tar.gz
945             KQ<*10('\BR:?)GP?@4JIXCD:I8('8Y2^&84UZ&7FY,
946             >N_$OG\/G)DD.[J#[^0[C*%&LV5,(`R^-[?M;@JCS\( tzdata95d.tar.gz
947             /6U6ZXX(+>?\U03Z9}:-7"!L^>MEIK7)'9C5HH(WSW`
948             UK10ZN/RN8-;Y,;"E1"1#PGX&0HM]PDH
949             H"&BY$<4KZ7!71S&04)J#\'6]&82]AQKAB68P6\*0*P
950             <[D\C}_8PJ&_MSU"^[@H?-52}C5V]TDBRLH7X>J/U#, tzdata95f.tar.gz
951             G/2,5}W49@O:M}9(A#N3FT6-<**<")+G.<9@Y!;V!B\
952             -ENM9%.#MB3?+1&68?/K//E7ZH^CUN<4B45(LNG5;?\ tzdata95g.tar.gz
953             L9}F1W`&)"$P@T&SBE2T*DFK.;&8>,M/"-BS:YD:#`0
954             E@B_'/TXJ);[-4/'>CZG&EM;@$M_E2>'CHQC:?/QMWX tzdata95h.tar.gz
955             /U5IZ<;%-%/U0<3P^3(5M2BVT7\
956             S(-M
957             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
958             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata95j.tar.gz
959             R$]+?^89IS3!}FN8+,S!&,H8(S>I#C45MES$S#KX^%\
960             :Y/7DH,A]95[+ZA9O#]&Y&BMV]"37)%(N/Y9G%0EV}L tzdata95k.tar.gz
961             G8T8F^UF`0M!R6LW3KR;}+^&G^KKZI4P,.]#D$5]6X@
962             2%^`'Y'VSV0/<<&?3W9074X%$*9:<^(#2*]S8UI>&7X tzdata95l.tar.gz
963             'F$H':/>%]H>`OD"!3N.:6\\,V}IO.@&`3:I!2N:H`D
964             '7_L@ tzdata95m.tar.gz
965             &.W1T1O<\(IUQ$;3%]#N5OR4%2CBS((Q+%2W9WBA)RT
966             H2",;_G2S,IK6S/:9Z@5SQOC>35#};%\H0\(QZX3E7X tzdata96a.tar.gz
967             ;[5--'"@UVZ<6_7R2'69K9]LI^_NKK$Z7'?[?D)J"0\
968             IYG-A$2V]JTJ4^.199<0M86/'#2_%F.1!&%}4A"?2Z$ tzdata96b.tar.gz
969             OH08*[]G6C7"1+()`Y$>W6}4}_>*A^}:;F]>^R!9^I(
970             $A'.>.)S}"N^:S}Z:/00BM8'90_MHJ*D^QIAYVV_;3\ tzdata96c.tar.gz
971             QB,?UNF6I/Y3#3+;P6.>6-@H_"Y*]/#4`;>CW_I<:SH
972             %M}$M):,^\^?Z[4,;_JH>SN+#H_<5,}^*!"H+XEEA`D tzdata96d.tar.gz
973             #O,UW,"*#<15#()N,GQC_/Y9O/L`
974             :2-JT#KZI0FJP-.LLXC#CW\!%L-U*C?>J*:@8K,)V>@ tzdata96e.tar.gz
975             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
976             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata96f.tar.gz
977             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
978             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata96g.tar.gz
979             ._'Q1`S6W[R?9_ZX1*JPC\TW,O5CW^DE"%YZ`6,:]/T
980             "+M_K7?DY5;W//<.`D}"/V;Z7_.??E\559ME4;1+(WH tzdata96h.tar.gz
981             ^5CS5<:'C?A'@"FA&EC'UJUN.,MD?Z5WP;A@ZA(/RG4
982             FW'}]S6G:+FDJ"QZJ<}/0FC[RY^?ZQGKXY8OWE&P3%T tzdata96i.tar.gz
983             FD'\3M:VB7HFI+JI;(LKG^FYW6@W)IW'1+S-I-E)944
984             '99V)&RW@>Z!4WB6N[`2!I64*`#DIN.?VO9P!2JAG>$ tzdata96k.tar.gz
985             ?&*!2]H`X6N>54;SG#YC#IF&4**`'5NIX4EV*%E>(2`
986             6:CTF"UF/}I<`(QMUXUB
987             HASHES
988              
989             sub _verify_sha512($$$) {
990 0     0     my($self, $localname, $canonname) = @_;
991 0 0         unless(ref $archive_hash) {
992 0           pos($archive_hash) = 0;
993 0           my %ah;
994 0           until($archive_hash =~ /\G\z/gc) {
995 0 0         if($archive_hash =~ /\G([!-`\}]{43})\n([!-`\}]{43})
    0          
996             \ ([!-~]+)\n/xgc) {
997 0           my($h0, $h1, $name) = ($1, $2, $3);
998 0           tr/}/=/ foreach $h0, $h1;
999 0           $ah{$name} = unpack("u", "\@$h0`\n").
1000             unpack("u", "\@$h1`\n");
1001             } elsif($archive_hash =~ /\G\~{43}\n\~{43}
1002             \ ([!-~]+)\n/xgc) {
1003 0           $ah{$1} = "";
1004 0           } else { die }
1005             }
1006 0           $archive_hash = \%ah;
1007             }
1008 0           my $rh = $archive_hash->{$canonname};
1009 0 0         defined $rh or die "attempt to check SHA-512 of unknown file\n";
1010 0 0         if($rh ne "") {
1011             my $ch = filter("", "sha512sum",
1012 0           $self->{top_dir}."/".$localname);
1013 0 0         $ch =~ /\A([0-9a-f]{128})\ +[!-~]+\n\z/
1014             or die "bizarre output from sha512sum\n";
1015 0 0         pack("H*", $1) eq $rh or die "SHA-512 hash mismatch\n";
1016             }
1017             }
1018              
1019             sub _init_ftp($$) {
1020 0     0     my($self, $hostname) = @_;
1021 0           $self->{ftp_hostname} = $hostname;
1022 0 0         $self->{ftp} = Net::FTP->new($hostname)
1023             or die "FTP error on $hostname: $@\n";
1024             }
1025              
1026             sub _ftp_op($$@) {
1027 0     0     my($self, $method, @args) = @_;
1028             $self->{ftp}->$method(@args)
1029 0           or die "FTP error on @{[$self->{ftp_hostname}]}: ".
1030 0 0         $self->{ftp}->message;
1031             }
1032              
1033             sub _ftp_login($$$) {
1034 0     0     my($self, $hostname, $dirarray) = @_;
1035 0           _init_ftp($self, $hostname);
1036 0           _ftp_op($self, "login", "anonymous","-anonymous\@");
1037 0           _ftp_op($self, "binary");
1038 0           _ftp_op($self, "cwd", $_) foreach @$dirarray;
1039             }
1040              
1041             sub _ensure_ftp($) {
1042 0     0     my($self) = @_;
1043 0 0         unless($self->{ftp}) {
1044             # Always use IANA master. Could possibly look at mirrors,
1045             # but the IANA site is probably reliable enough.
1046 0           _ftp_login($self, "ftp.iana.org", ["tz", "releases"]);
1047             }
1048             }
1049              
1050             sub _cmp_version($$) {
1051 0     0     my($a, $b) = @_;
1052 0 0         $a = "19".$a if $a =~ /\A[0-9]{2}(?:[a-z][23]?)?\z/;
1053 0 0         $b = "19".$b if $b =~ /\A[0-9]{2}(?:[a-z][23]?)?\z/;
1054 0           return $a cmp $b;
1055             }
1056              
1057 0     0     sub _ge_version($$) { _cmp_version($_[0], $_[1]) >= 0 }
1058              
1059             my $split_rels = q(
1060             93 AA -b cc dd ee ff gg
1061             94 -a bb c- dd e- f- g- -e -f hh
1062             95 bb c- -c -d -e -f -g d- -h -i e- fj gk hl im
1063             96 aa b- c- -b dc e- -d -e -f fg -h g- h- -i i- j- kk l-
1064             1996 ml -m n- on
1065             1997 aa bb -c cd de ef fg gh -i hj ik
1066             1998 aa bb cc dd ee f- -f -g gh hi
1067             1999 aa bb cc dd ee ff gg -h hi ij
1068             2000 aa bb cc -d d- ee ff gg hh
1069             2001 aa bb cc dd
1070             2002 aa bb cc dd
1071             2003 aa bb cc dd ee
1072             2004 aa bb c- -d d- ee f- gg h- i-
1073             2005 aa bb cc d- ee ff gg hh -i jj kk ll mm nn oo pp qq rr
1074             2006 aa bb cc dd ee ff gg h- i- jj kk -l mm nn oo pp
1075             2007 aa bb cc dd ee ff gg hh -i jj kk
1076             2008 aa -b -c -d ee -f gg hh -i
1077             2009 aa bb -c dd ee -f -g hh ii -j kk -l -m -n -o -p qq rr -s tt -u
1078             2010 -a -b a- cc -d -e ff -g -h -i jj kk ll mm nn -o
1079             2011 aa bb cc dd ee -f gg -h ii -j -k -l -m -n
1080             2012 aa bb -c cd ee ff gg hh ii jj
1081             2013 aa bb cc dd ee ff gg hh ii
1082             2014 aa bb cc dd ee ff gg hh ii jj
1083             2015 aa bb cc dd ee ff gg
1084             2016 aa bb cc dd ee ff
1085             );
1086             sub _split_rel_versions($) {
1087 0     0     my($version) = @_;
1088 0 0         unless(ref $split_rels) {
1089 0           my(%sr, $year, $cver, $dver, $lastver, $lastnum);
1090 0           $lastver = "";
1091 0           foreach(split(" ", $split_rels)) {
1092 0 0         if(/\A[0-9]/) {
1093 0           $year = $_;
1094             } else {
1095 0           my($cl, $dl) = (/\A(.)(.)\z/s);
1096 0 0         $cver = $year.($cl eq "A" ? "" : $cl)
    0          
1097             unless $cl eq "-";
1098 0 0         $dver = $year.($dl eq "A" ? "" : $dl)
    0          
1099             unless $dl eq "-";
1100 0 0         my $ver = _ge_version($cver, $dver) ?
1101             $cver : $dver;
1102 0 0         if($ver eq $lastver) {
1103 0           $lastnum++;
1104 0           $ver .= $lastnum;
1105             } else {
1106 0           $lastver = $ver;
1107 0           $lastnum = 1;
1108             }
1109 0           $sr{$ver} = [ $cver, $dver ];
1110             }
1111             }
1112 0           $split_rels = \%sr;
1113             }
1114 0           my $cdv = $split_rels->{$version};
1115 0 0         defined $cdv or die "no such Olson DB version `$version'\n";
1116 0           return $cdv;
1117             }
1118              
1119             sub _latest_version($) {
1120 0     0     my($self) = @_;
1121 0           my $latest;
1122 0           _ensure_ftp($self);
1123 0           foreach(@{
1124 0           _ftp_op($self, "ls", "tzdb-[0-9][0-9][0-9][0-9][a-z].tar.lz")
1125             }) {
1126 0 0         if(m#(?:\A|/)tzdb-([0-9]{4}[a-z])\.tar\.lz\z#) {
1127 0 0         next unless _ge_version($1, "2016g");
1128 0 0 0       $latest = $1
1129             if !defined($latest) ||
1130             _ge_version($1, $latest);
1131             }
1132             }
1133 0 0         unless(defined $latest) {
1134 0           die "no current timezone database found on ".
1135 0           "@{[$self->{ftp_hostname}]}\n";
1136             }
1137 0           return $latest;
1138             }
1139              
1140             =head1 CLASS METHODS
1141              
1142             =over
1143              
1144             =item Time::OlsonTZ::Download->latest_version
1145              
1146             Returns the version number of the latest available version of the Olson
1147             timezone database. This requires consulting the repository, but is much
1148             cheaper than actually downloading the database.
1149              
1150             =cut
1151              
1152             sub latest_version {
1153 0     0 1   my($class) = @_;
1154 0 0         croak "@{[__PACKAGE__]}->latest_version not called as a class method"
  0            
1155             unless is_string($class);
1156 0           return _latest_version({});
1157             }
1158              
1159             =back
1160              
1161             =cut
1162              
1163             sub DESTROY {
1164 0     0     my($self) = @_;
1165 0           local($., $@, $!, $^E, $?);
1166 0 0         rmtree($self->{top_dir}, 0, 0) if exists $self->{top_dir};
1167             }
1168              
1169             =head1 CONSTRUCTORS
1170              
1171             =over
1172              
1173             =item Time::OlsonTZ::Download->new([VERSION])
1174              
1175             Downloads a copy of the source of the Olson database, and returns an
1176             object representing that copy.
1177              
1178             I, if supplied, is a version number specifying which version of
1179             the database is to be downloaded. If not supplied, the latest available
1180             version will be downloaded. Version numbers for the Olson database
1181             currently consist of a year number and a lowercase letter, such as
1182             "C<2010k>". The letter advances with each release in a year.
1183              
1184             Historical vesrions make the version numbers a bit more complicated.
1185             Prior to late 1996 the century portion of the year number was omitted,
1186             giving version numbers such as "C<96g>". Prior to 1994 the first release
1187             of each year omitted the letter "C", giving version numbers such as
1188             "C<93>" (with the second release of the year being "C<93b>").
1189              
1190             From 1993 to to late 2012 the database was split into `code' and `data'
1191             parts that could each be released without releasing a new version of the
1192             other part. Each part had its own version number, sometimes advancing
1193             independently of each other, and sometimes skipping sequence letters
1194             in order to catch up with the other part. Where the two parts of some
1195             version of the database have different version numbers, the version
1196             number of the database as a whole is whichever part's version number
1197             is higher. If this would give two database versions the same number,
1198             due to multiple releases of one part happening while the other part has
1199             a higher version number, a digit "C<2>" or "C<3>" is appended after the
1200             letter to distinguish the second and third such versions.
1201              
1202             This module does not currently support downloading database versions
1203             earlier than version 93. One can expect to successfully download most
1204             versions from then on, but a handful are missing from the public archive.
1205             The public archive is complete from version 2006f onwards. Details of
1206             historical version availability may change in future.
1207              
1208             =cut
1209              
1210             sub _download_file($$$$$) {
1211 0     0     my($self, $remote_name, $local_name, $with_sig, $enoent) = @_;
1212 0           my $tdir = $self->{top_dir};
1213 0           _ensure_ftp($self);
1214 0 0         @{$self->_ftp_op("ls", $remote_name)} or $enoent->();
  0            
1215 0           $self->_ftp_op("get", $remote_name, "$tdir/$local_name");
1216 0 0         if($with_sig) {
1217 0           $self->_ftp_op("get", "$remote_name.asc",
1218             "$tdir/$local_name.asc");
1219             }
1220             }
1221              
1222             sub new {
1223 0     0 1   my($class, $version) = @_;
1224 0 0 0       die "malformed Olson version number `$version'\n"
      0        
1225             unless is_undef($version) ||
1226             (is_string($version) &&
1227             $version =~ /\A[0-9]{2}(?:[0-9]{2})?
1228             (?:[a-z][23]?)?\z/x);
1229 0           my $self = bless({}, $class);
1230 0   0       $version ||= $self->_latest_version;
1231 0           $self->{version} = $version;
1232 0           my $tdir = tempdir();
1233 0           $self->{top_dir} = $tdir;
1234 0           $self->{olson_dir} = "$tdir/c";
1235 0           filter("", "mkdir", $self->{olson_dir});
1236 0 0         if(_ge_version($version, "2016g")) {
    0          
1237 0           $self->{code_version} = $version;
1238 0           $self->{data_version} = $version;
1239             _download_file($self, "tzdb-$version.tar.lz", "tzdb.tar.lz", 1,
1240 0     0     sub () { die "no such Olson DB version `$version'\n" });
  0            
1241 0           _verify_signature($self, "tzdb.tar.lz");
1242             filter("", "tar", "-xO", "--lzip",
1243 0 0         "-f", $self->{top_dir}."/tzdb.tar.lz",
1244             "tzdb-$version/version") eq "$version\n"
1245             or die "tzdb.tar.lz is not the expected version\n";
1246             } elsif(_ge_version($version, "93")) {
1247 0           my($cver, $dver) = @{_split_rel_versions($version)};
  0            
1248 0           foreach(["code", $cver], ["data", $dver]) {
1249 0           my($part, $pver) = @$_;
1250 0           $self->{"${part}_version"} = $pver;
1251 0 0         my $zext = _ge_version($pver, "93g") ? "gz" : "Z";
1252 0           my $rname = "tz$part$pver.tar.$zext";
1253 0           $rname =~ s/\Atz(?=code2006b.tar.gz\z)/tz64/;
1254             _download_file($self, $rname, "tz$part.tar.gz", 0,
1255             sub () {
1256 0     0     die "file $rname is not available on ".
1257 0           "@{[$self->{ftp_hostname}]}\n";
1258 0           });
1259 0           _verify_sha512($self, "tz$part.tar.gz", $rname);
1260             }
1261             } else {
1262 0           die "Olson DB version $version is too early for this module\n";
1263             }
1264 0           delete $self->{ftp};
1265 0           delete $self->{ftp_hostname};
1266 0           $self->{downloaded} = 1;
1267 0           return $self;
1268             }
1269              
1270             =item Time::OlsonTZ::Download->new_from_local_source(ATTR => VALUE, ...)
1271              
1272             Acquires Olson database source locally, without downloading, and returns
1273             an object representing a copy of it ready to use like a download.
1274             This can be used to work with locally-modified versions of the database.
1275             The following attributes may be given:
1276              
1277             =over
1278              
1279             =item B
1280              
1281             Local directory containing Olson source files. Must be supplied.
1282             The entire directory will be copied into a temporary location to be
1283             worked on.
1284              
1285             =item B
1286              
1287             Olson version number to attribute to the source files. Must be supplied.
1288              
1289             =item B
1290              
1291             =item B
1292              
1293             Olson version number to attribute to the code and data parts of the
1294             source files. Both default to the main version number.
1295              
1296             =back
1297              
1298             =cut
1299              
1300             sub new_from_local_source {
1301 0     0 1   my $class = shift;
1302 0           my $self = bless({}, $class);
1303 0           my $srcdir;
1304 0           while(@_) {
1305 0           my $attr = shift;
1306 0           my $value = shift;
1307 0 0         if($attr eq "source_dir") {
    0          
    0          
1308 0 0         croak "source directory specified redundantly"
1309             if defined $srcdir;
1310 0 0         croak "source directory must be a string"
1311             unless is_string($value);
1312 0           $srcdir = $value;
1313             } elsif($attr eq "version") {
1314             croak "version specified redundantly"
1315 0 0         if exists $self->{version};
1316 0 0 0       die "malformed Olson version number `$value'\n"
1317             unless is_string($value) &&
1318             $value =~ /\A[0-9]{2}(?:[0-9]{2})?
1319             (?:[a-z][23]?)?\z/x;
1320 0           $self->{version} = $value;
1321             } elsif($attr =~ /\A(?:code|data)_version\z/) {
1322             croak "$attr specified redundantly"
1323 0 0         if exists $self->{$attr};
1324 0 0 0       die "malformed Olson part version number `$value'\n"
1325             unless is_string($value) &&
1326             $value =~ /\A[0-9]{2}(?:[0-9]{2})?
1327             [a-z]?\z/x;
1328 0           $self->{$attr} = $value;
1329             } else {
1330 0           croak "unrecognised attribute `$attr'";
1331             }
1332             }
1333 0 0         croak "source directory not specified" unless defined $srcdir;
1334 0 0         croak "version number not specified" unless exists $self->{version};
1335 0           foreach(qw(code_version data_version)) {
1336 0 0         $self->{$_} = $self->{version} unless exists $self->{$_};
1337             }
1338 0           my $tdir = tempdir();
1339 0           $self->{top_dir} = $tdir;
1340 0           $self->{olson_dir} = "$tdir/c";
1341 0 0         $srcdir = "./$srcdir" unless $srcdir =~ m#\A\.?/#;
1342 0           filter("", "cp", "-pr", $srcdir, $self->{olson_dir});
1343 0           $self->{downloaded} = 1;
1344 0           $self->{unpacked} = 1;
1345 0           return $self;
1346             }
1347              
1348             =back
1349              
1350             =head1 METHODS
1351              
1352             =head2 Basic information
1353              
1354             =over
1355              
1356             =item $download->version
1357              
1358             Returns the version number of the database of which a copy is represented
1359             by this object.
1360              
1361             The database consists of code and data parts which are updated
1362             semi-independently. The latest version of the database as a whole
1363             consists of the latest version of the code and the latest version of
1364             the data. If both parts are updated at once then they will both get the
1365             same version number, and that will be the version number of the database
1366             as a whole. However, in general they may be updated at different times,
1367             and a single version of the database may be made up of code and data
1368             parts that have different version numbers. The version number of the
1369             database as a whole will then be the version number of the most recently
1370             updated part.
1371              
1372             =cut
1373              
1374             sub version {
1375 0     0 1   my($self) = @_;
1376             die "Olson database version not determined\n"
1377 0 0         unless exists $self->{version};
1378 0           return $self->{version};
1379             }
1380              
1381             =item $download->code_version
1382              
1383             Returns the version number of the code part of the database of which a
1384             copy is represented by this object.
1385              
1386             =cut
1387              
1388             sub code_version {
1389 0     0 1   my($self) = @_;
1390             die "Olson database code version not determined\n"
1391 0 0         unless exists $self->{code_version};
1392 0           return $self->{code_version};
1393             }
1394              
1395             =item $download->data_version
1396              
1397             Returns the version number of the data part of the database of which a
1398             copy is represented by this object.
1399              
1400             =cut
1401              
1402             sub data_version {
1403 0     0 1   my($self) = @_;
1404             die "Olson database data version not determined\n"
1405 0 0         unless exists $self->{data_version};
1406 0           return $self->{data_version};
1407             }
1408              
1409             =item $download->dir
1410              
1411             Returns the pathname of the directory in which the files of this download
1412             are located. With this method, there is no guarantee of particular
1413             files being available in the directory; see other directory-related
1414             methods below that establish particular directory contents.
1415              
1416             The directory does not move during the lifetime of the download object:
1417             this method will always return the same pathname. The directory and
1418             all of its contents, including subdirectories, will be automatically
1419             deleted when this object is destroyed. This will be when the main
1420             program terminates, if it is not otherwise destroyed. Any files that
1421             it is desired to keep must be copied to a permanent location.
1422              
1423             =cut
1424              
1425             sub dir {
1426 0     0 1   my($self) = @_;
1427             die "download directory not created\n"
1428 0 0         unless exists $self->{olson_dir};
1429 0           return $self->{olson_dir};
1430             }
1431              
1432             sub _ensure_downloaded {
1433 0     0     my($self) = @_;
1434             die "can't use download because downloading failed\n"
1435 0 0         unless $self->{downloaded};
1436             }
1437              
1438             sub _ensure_unpacked {
1439 0     0     my($self) = @_;
1440 0 0         unless($self->{unpacked}) {
1441 0           $self->_ensure_downloaded;
1442 0 0         if(_ge_version($self->{version}, "2016g")) {
1443             filter("", "tar", "-C", $self->dir,
1444             "-x", "--strip-components=1", "--lzip",
1445 0           "-f", $self->{top_dir}."/tzdb.tar.lz");
1446             } else {
1447 0           foreach my $part (qw(tzcode tzdata)) {
1448             filter("", "tar", "-C", $self->dir,
1449             "-x", "--gzip",
1450 0           "-f", $self->{top_dir}."/$part.tar.gz");
1451             }
1452             }
1453 0           $self->{unpacked} = 1;
1454             }
1455             }
1456              
1457             =item $download->unpacked_dir
1458              
1459             Returns the pathname of the directory in which the downloaded source
1460             files have been unpacked. This is the local temporary directory used
1461             by this download. This method will unpack the files there if they have
1462             not already been unpacked.
1463              
1464             =cut
1465              
1466             sub unpacked_dir {
1467 0     0 1   my($self) = @_;
1468 0           $self->_ensure_unpacked;
1469 0           return $self->dir;
1470             }
1471              
1472             =back
1473              
1474             =head2 Zone metadata
1475              
1476             =over
1477              
1478             =cut
1479              
1480             sub _ensure_canonnames_and_rawlinks {
1481 0     0     my($self) = @_;
1482 0 0         unless(exists $self->{canonical_names}) {
1483 0           my %seen;
1484             my %canonnames;
1485 0           my %rawlinks;
1486 0           foreach(@{$self->zic_input_files}) {
  0            
1487 0 0         my $fh = IO::File->new($_, "r")
1488             or die "data file $_ unreadable: $!\n";
1489 0           local $/ = "\n";
1490 0           while(defined(my $line = $fh->getline)) {
1491 0 0         if($line =~ /\A[Zz](?:[Oo](?:[Nn][Ee]?)?)?
    0          
1492             [ \t]+([!-~]+)[ \t\n]/x) {
1493 0           my $name = $1;
1494             die "zone $name multiply defined\n"
1495 0 0         if exists $seen{$name};
1496 0           $seen{$name} = undef;
1497 0           $canonnames{$name} = undef;
1498             } elsif($line =~ /\A[Ll](?:[Ii](?:[Nn][Kk]?)?)?
1499             [\ \t]+([!-~]+)[\ \t]+
1500             ([!-~]+)[\ \t\n]/x) {
1501 0           my($target, $name) = ($1, $2);
1502             die "zone $name multiply defined\n"
1503 0 0         if exists $seen{$name};
1504 0           $seen{$name} = undef;
1505 0           $rawlinks{$name} = $target;
1506             }
1507             }
1508             }
1509 0           $self->{raw_links} = \%rawlinks;
1510 0           $self->{canonical_names} = \%canonnames;
1511             }
1512             }
1513              
1514             =item $download->canonical_names
1515              
1516             Returns the set of timezone names that this version of the database
1517             defines as canonical. These are the timezone names that are directly
1518             associated with a set of observance data. The return value is a reference
1519             to a hash, in which the keys are the canonical timezone names and the
1520             values are all C.
1521              
1522             =cut
1523              
1524             sub canonical_names {
1525 0     0 1   my($self) = @_;
1526 0           $self->_ensure_canonnames_and_rawlinks;
1527 0           return $self->{canonical_names};
1528             }
1529              
1530             =item $download->link_names
1531              
1532             Returns the set of timezone names that this version of the database
1533             defines as links. These are the timezone names that are aliases for
1534             other names. The return value is a reference to a hash, in which the
1535             keys are the link timezone names and the values are all C.
1536              
1537             =cut
1538              
1539             sub link_names {
1540 0     0 1   my($self) = @_;
1541 0 0         unless(exists $self->{link_names}) {
1542             $self->{link_names} =
1543 0           { map { ($_ => undef) } keys %{$self->raw_links} };
  0            
  0            
1544             }
1545 0           return $self->{link_names};
1546             }
1547              
1548             =item $download->all_names
1549              
1550             Returns the set of timezone names that this version of the database
1551             defines. These are the L and the L.
1552             The return value is a reference to a hash, in which the keys are the
1553             timezone names and the values are all C.
1554              
1555             =cut
1556              
1557             sub all_names {
1558 0     0 1   my($self) = @_;
1559 0 0         unless(exists $self->{all_names}) {
1560             $self->{all_names} = {
1561 0           %{$self->canonical_names},
1562 0           %{$self->link_names},
  0            
1563             };
1564             }
1565 0           return $self->{all_names};
1566             }
1567              
1568             =item $download->raw_links
1569              
1570             Returns details of the timezone name links in this version of the
1571             database. Each link defines one timezone name as an alias for some
1572             other timezone name. The return value is a reference to a hash, in
1573             which the keys are the aliases and each value is the preferred timezone
1574             name to which that alias directly refers. It is possible for an alias
1575             to point to another alias, or to point to a non-existent name. For a
1576             more processed view of links, see L.
1577              
1578             =cut
1579              
1580             sub raw_links {
1581 0     0 1   my($self) = @_;
1582 0           $self->_ensure_canonnames_and_rawlinks;
1583 0           return $self->{raw_links};
1584             }
1585              
1586             =item $download->threaded_links
1587              
1588             Returns details of the timezone name links in this version of the
1589             database. Each link defines one timezone name as an alias for some
1590             other timezone name. The return value is a reference to a hash, in
1591             which the keys are the aliases and each value is the canonical name of
1592             the timezone to which that alias refers. All such canonical names can
1593             be found in the L hash.
1594              
1595             =cut
1596              
1597             sub threaded_links {
1598 0     0 1   my($self) = @_;
1599 0 0         unless(exists $self->{threaded_links}) {
1600 0           my $raw_links = $self->raw_links;
1601 0           my %links = %$raw_links;
1602 0           while(1) {
1603 0           my $done_any;
1604 0           foreach(keys %links) {
1605 0 0         next unless exists $raw_links->{$links{$_}};
1606 0           $links{$_} = $raw_links->{$links{$_}};
1607 0 0         die "circular link at $_\n" if $links{$_} eq $_;
1608 0           $done_any = 1;
1609             }
1610 0 0         last unless $done_any;
1611             }
1612 0           my $canonical_names = $self->canonical_names;
1613 0           foreach(keys %links) {
1614             die "link from $_ to non-existent zone $links{$_}\n"
1615 0 0         unless exists $canonical_names->{$links{$_}};
1616             }
1617 0           $self->{threaded_links} = \%links;
1618             }
1619 0           return $self->{threaded_links};
1620             }
1621              
1622             =item $download->country_selection
1623              
1624             Returns information about how timezones relate to countries, intended
1625             to aid humans in selecting a geographical timezone. This information
1626             is derived from the C and C files in the database
1627             source.
1628              
1629             The return value is a reference to a hash, keyed by (ISO 3166 alpha-2
1630             uppercase) country code. The value for each country is a hash containing
1631             these values:
1632              
1633             =over
1634              
1635             =item B
1636              
1637             The ISO 3166 alpha-2 uppercase country code.
1638              
1639             =item B
1640              
1641             An English name for the country, possibly in a modified form, optimised
1642             to help humans find the right entry in alphabetical lists. This is
1643             not necessarily identical to the country's standard short or long name.
1644             (For other forms of the name, consult a database of countries, keying
1645             by the country code.)
1646              
1647             =item B
1648              
1649             Information about the regions of the country that use distinct
1650             timezones. This is a hash, keyed by English description of the region.
1651             The description is empty if there is only one region. The value for
1652             each region is a hash containing these values:
1653              
1654             =over
1655              
1656             =item B
1657              
1658             Brief English description of the region, used to distinguish between
1659             the regions of a single country. Empty string if the country has only
1660             one region for timezone purposes. (This is the same string used as the
1661             key in the B hash.)
1662              
1663             =item B
1664              
1665             Name of the Olson timezone used in this region. This is not necessarily
1666             a canonical name (it may be a link). Typically, where there are aliases
1667             or identical canonical zones, a name is chosen that refers to a location
1668             in the country of interest. It is not guaranteed that the named timezone
1669             exists in the database (though it always should).
1670              
1671             =item B
1672              
1673             Geographical coordinates of some point within the location referred to in
1674             the timezone name. This is a latitude and longitude, in ISO 6709 format.
1675              
1676             =back
1677              
1678             =back
1679              
1680             This data structure is intended to help a human select the appropriate
1681             timezone based on political geography, specifically working from a
1682             selection of country. It is of essentially no use for any other purpose.
1683             It is not strictly guaranteed that every geographical timezone in the
1684             database is listed somewhere in this structure, so it is of limited use
1685             in providing information about an already-selected timezone. It does
1686             not include non-geographic timezones at all. It also does not claim
1687             to be a comprehensive list of countries, and does not make any claims
1688             regarding the political status of any entity listed: the "country"
1689             classification is loose, and used only for identification purposes.
1690              
1691             =cut
1692              
1693             sub country_selection {
1694 0     0 1   my($self) = @_;
1695 0 0         unless(exists $self->{country_selection}) {
1696 0           my $itabname = $self->unpacked_dir."/iso3166.tab";
1697 0           my $ztabname = $self->unpacked_dir."/zone.tab";
1698 0           local $/ = "\n";
1699 0           my %itab;
1700 0 0         my $itabfh = IO::File->new($itabname, "r")
1701             or die "data file $itabname unreadable: $!\n";
1702 0           while(defined(my $line = $itabfh->getline)) {
1703 0           $line = decode("UTF-8", $line, FB_CROAK);
1704 0           utf8::upgrade($line);
1705 0 0         if($line =~ /\A([A-Z]{2})\t(\S[^\t\n]*\S)\n\z/) {
    0          
1706             die "duplicate $itabname entry for $1\n"
1707 0 0         if exists $itab{$1};
1708 0           $itab{$1} = $2;
1709             } elsif($line !~ /\A#[^\n]*\n\z/) {
1710 0           die "bad line in $itabname\n";
1711             }
1712             }
1713 0           my %sel;
1714 0 0         my $ztabfh = IO::File->new($ztabname, "r")
1715             or die "data file $ztabname unreadable: $!\n";
1716 0           while(defined(my $line = $ztabfh->getline)) {
1717 0 0         if($line =~ /\A([A-Z]{2})
    0          
1718             \t([-+][0-9]{4}(?:[0-9]{2})?
1719             [-+][0-9]{5}(?:[0-9]{2})?)
1720             \t([!-~]+)
1721             (?:\t([!-~][ -~]*[!-~]))?
1722             \n\z/x) {
1723 0           my($cc, $coord, $zn, $reg) = ($1, $2, $3, $4);
1724 0 0         $reg = "" unless defined $reg;
1725 0   0       $sel{$cc} ||= { regions => {} };
1726             die "duplicate $ztabname entry for $cc\n"
1727 0 0         if exists $sel{$cc}->{regions}->{$reg};
1728 0           $sel{$cc}->{regions}->{$reg} = {
1729             olson_description => $reg,
1730             timezone_name => $zn,
1731             location_coords => $coord,
1732             };
1733             } elsif($line !~ /\A#[^\n]*\n\z/) {
1734 0           die "bad line in $ztabname\n";
1735             }
1736             }
1737 0           foreach(keys %sel) {
1738 0 0         die "unknown country $_\n" unless exists $itab{$_};
1739 0           $sel{$_}->{alpha2_code} = $_;
1740 0           $sel{$_}->{olson_name} = $itab{$_};
1741             die "bad region description in $_\n"
1742 0           if keys(%{$sel{$_}->{regions}}) == 1 xor
1743 0 0 0       exists($sel{$_}->{regions}->{""});
1744             }
1745 0           $self->{country_selection} = \%sel;
1746             }
1747 0           return $self->{country_selection};
1748             }
1749              
1750             =back
1751              
1752             =head2 Compiling zone data
1753              
1754             =over
1755              
1756             =item $download->source_data_files
1757              
1758             Returns a reference to an array containing the pathnames of all the source
1759             data files. These express the database's data (i.e., a description
1760             of known civil timezones) in a textual format, and are intended for
1761             human editing. They are located in the local temporary directory used
1762             by this download.
1763              
1764             There is normally approximately one source data file per continent,
1765             though this arrangement could change in the future. The textual format
1766             is machine parseable, the same format intended for input to C, but
1767             when interpreted this way the files do not necessarily correspond to the
1768             the official content of the database. There may be transformations that
1769             the database code would normally apply between the source data files
1770             and the actual input to C.
1771              
1772             If you intend to parse the source, taking the place of C, then you
1773             should prefer to use the L method, which provides the
1774             input that C would actually see.
1775              
1776             =cut
1777              
1778             sub source_data_files {
1779 0     0 1   my($self) = @_;
1780 0 0         unless(exists $self->{source_data_files}) {
1781 0           my $list;
1782 0           $self->_ensure_unpacked;
1783 0           my $mf = IO::File->new($self->dir."/Makefile", "r");
1784 0 0         my $mfc = $mf ? do { local $/ = undef; $mf->getline } : "";
  0            
  0            
1785 0           my $datavars = "\$(TDATA)";
1786 0 0 0       if($mfc =~ m#
    0          
1787             \nfulldata\.zi(?:[\ \t]+[0-9A-Z_a-z]+\.zi)*[\ \t]*:
1788             [\ \t]+\$\(DSTDATA_ZI_DEPS\)[\ \t]*\n
1789             \t[\ \t]*\$\(AWK\)\ -v\ outfile\=\'\$\@\'
1790             \ -f\ zidst\.awk
1791             \ \$\(TDATA\)\ \$\(PACKRATDATA\)
1792             \ (?:\\\n\t[\ \t]*)?\>\$\@.out\n
1793             \t[\ \t]*mv\ \$\@\.out\ \$\@\n[^\t]
1794             #x || $mfc =~ m#
1795             \ntzdata\.zi:[\ \t]+\$\(TZDATA_ZI_DEPS\)[\ \t]*\n
1796             (?:\t[\ \t]*version=\`sed\ 1q\ version\`\ \&\&\ \\\n)?
1797             \t[\ \t]*LC_ALL=C\ \$\(AWK\)
1798             (?:\ -v\ version="\$\$version")?
1799             \ -f\ zishrink\.awk
1800             \ (?:\\\n\t[\ \t]*)?
1801             \$\(TDATA\)\ \$\(PACKRATDATA\)\ \>\$\@.out\n
1802             \t[\ \t]*mv\ \$\@\.out\ \$\@\n\n
1803             #x) {
1804 0           $datavars .= " \$(PACKRATDATA)";
1805             } elsif($mfc =~ m#\ntzdata\.zi:#) {
1806 0           die "don't know how to extract source data file names ".
1807             "from this form of Olson distribution\n";
1808             }
1809 0           $list = filter("", "make", "--no-print-directory",
1810             "-C", $self->dir, "names",
1811             "ENCHILADA=$datavars", "VERSION_DEPS=");
1812 0           $list =~ s#\n\z##;
1813             $self->{source_data_files} =
1814 0           [ map { $self->dir."/".$_ } split(/ /, $list) ];
  0            
1815             }
1816 0           return $self->{source_data_files};
1817             }
1818              
1819             =item $download->zic_input_files
1820              
1821             Returns a reference to an array containing the pathnames of all the
1822             data files that would normally be fed to C. These express the
1823             database's data (i.e., a description of known civil timezones) in
1824             the format expected by C, and are suitable for machine parsing.
1825             They are located in the local temporary directory used by this download.
1826             This method will build the files if they didn't already exist.
1827              
1828             The C input files are not necessarily source files intended for human
1829             editing. In older versions of the database they are such source files,
1830             but from database version C<2017c> onwards there is a single C input
1831             file, which is generated from the source files and omits the niceties of
1832             the source files. From database version C<2018d> onwards there is some
1833             transformation between the source files and the C input, such that
1834             they do not necessarily express the same data when parsed by C.
1835             These arrangements could change again in the future.
1836              
1837             The textual format of C input is not standardised, and is peculiar
1838             to the Olson database. Parsing it directly is in principle a dubious
1839             proposition, but in practice it is very stable.
1840              
1841             If you want the human-editable source form of the data, use the
1842             L method instead.
1843              
1844             =cut
1845              
1846             sub zic_input_files {
1847 0     0 1   my($self) = @_;
1848 0 0         unless(exists $self->{zic_input_files}) {
1849 0           $self->_ensure_unpacked;
1850 0           my $mf = IO::File->new($self->dir."/Makefile", "r");
1851 0 0         my $mfc = $mf ? do { local $/ = undef; $mf->getline } : "";
  0            
  0            
1852 0 0         if($mfc =~ m#\ntzdata\.zi:#) {
1853 0           filter("", "make", "-C", $self->dir, "tzdata.zi",
1854             "VERSION_DEPS=");
1855 0           $self->{zic_input_files} = [ $self->dir."/tzdata.zi" ];
1856             } else {
1857 0           $self->{zic_input_files} = $self->source_data_files;
1858             }
1859             }
1860 0           return $self->{zic_input_files};
1861             }
1862              
1863             =item $download->data_files
1864              
1865             Returns a reference to an array containing the pathnames of all the
1866             source data files, provided that the database code would feed the
1867             same data to C. This method is deprecated: you should use either
1868             L or L depending on which aspect of
1869             the data files you are interested in. In older versions of the database
1870             the same files were both human-editable and used as C input, so
1871             this single method served both roles. From database version C<2018d>
1872             onwards there is some transformation between the source files and the
1873             C input, so the two roles of the files need to be distinguished.
1874              
1875             =cut
1876              
1877             sub data_files {
1878 0     0 1   my($self) = @_;
1879 0 0         unless(exists $self->{data_files_dual_role}) {
1880 0           my $list;
1881 0           $self->_ensure_unpacked;
1882 0           my $mf = IO::File->new($self->dir."/Makefile", "r");
1883 0 0         my $mfc = $mf ? do { local $/ = undef; $mf->getline } : "";
  0            
  0            
1884 0 0 0       if($mfc !~ m#\ntzdata\.zi:# || $mfc =~ m#
1885             \ntzdata\.zi:[\ \t]+\$\(TZDATA_ZI_DEPS\)[\ \t]*\n
1886             (?:\t[\ \t]*version=\`sed\ 1q\ version\`\ \&\&\ \\\n)?
1887             \t[\ \t]*LC_ALL=C\ \$\(AWK\)
1888             (?:\ -v\ version="\$\$version")?
1889             \ -f\ zishrink\.awk
1890             \ (?:\\\n\t[\ \t]*)?
1891             \$\(TDATA\)\ \$\(PACKRATDATA\)\ \>\$\@.out\n
1892             \t[\ \t]*mv\ \$\@\.out\ \$\@\n\n
1893             #x) {
1894 0           $self->{data_files_dual_role} = 1;
1895             } else {
1896 0           $self->{data_files_dual_role} = 0;
1897             }
1898             }
1899 0 0         if($self->{data_files_dual_role}) {
1900 0           return $self->source_data_files;
1901             } else {
1902 0           die "source data files and zic input are distinct in ".
1903             "this form of Olson distribution\n";
1904             }
1905             }
1906              
1907             sub _ensure_zic_built {
1908 0     0     my($self) = @_;
1909 0 0         unless($self->{zic_built}) {
1910 0           $self->_ensure_unpacked;
1911 0           filter("", "make", "-C", $self->dir, "zic", "VERSION_DEPS=");
1912 0           $self->{zic_built} = 1;
1913             }
1914             }
1915              
1916             =item $download->zic_exe
1917              
1918             Returns the pathname of the C executable that has been built from
1919             the downloaded source. This is located in the local temporary directory
1920             used by this download. This method will build C if it has not
1921             already been built.
1922              
1923             =cut
1924              
1925             sub zic_exe {
1926 0     0 1   my($self) = @_;
1927 0           $self->_ensure_zic_built;
1928 0           return $self->dir."/zic";
1929             }
1930              
1931             =item $download->zoneinfo_dir([OPTIONS])
1932              
1933             Returns the pathname of the directory containing binary tzfiles (in
1934             L format) that have been generated from the downloaded source.
1935             This is located in the local temporary directory used by this download,
1936             and the files within it have names that match the timezone names (as
1937             returned by L). This method will generate the tzfiles if
1938             they have not already been generated.
1939              
1940             The optional parameter I controls which kind of tzfiles are
1941             desired. If supplied, it must be a reference to a hash, in which these
1942             keys are permitted:
1943              
1944             =over
1945              
1946             =item B
1947              
1948             Truth value, controls whether the tzfiles incorporate information about
1949             known leap seconds offsets that account for the known leap seconds.
1950             If false (which is the default), the tzfiles have no knowledge of leap
1951             seconds, and are intended to be used on a system where C is some
1952             flavour of UT (as is conventional on Unix and is the POSIX standard).
1953             If true, the tzfiles know about leap seconds that have occurred between
1954             1972 and the date of the database, and are intended to be used on a
1955             system where C is (from 1972 onwards) a linear count of TAI
1956             seconds (which is a non-standard arrangement).
1957              
1958             =back
1959              
1960             =cut
1961              
1962             sub _foreach_nondir_under($$);
1963             sub _foreach_nondir_under($$) {
1964 0     0     my($dir, $callback) = @_;
1965 0 0         my $dh = IO::Dir->new($dir) or die "can't examine $dir: $!\n";
1966 0           while(defined(my $ent = $dh->read)) {
1967 0 0         next if $ent =~ /\A\.\.?\z/;
1968 0           my $entpath = $dir."/".$ent;
1969 0 0         if(-d $entpath) {
1970 0           _foreach_nondir_under($entpath, $callback);
1971             } else {
1972 0           $callback->($entpath);
1973             }
1974             }
1975             }
1976              
1977             sub zoneinfo_dir {
1978 0     0 1   my($self, $options) = @_;
1979 0 0         $options = {} if is_undef($options);
1980 0           foreach(keys %$options) {
1981 0 0         die "bad option `$_'\n" unless /\Aleaps\z/;
1982             }
1983 0 0         my $type = $options->{leaps} ? "right" : "posix";
1984 0           my $zidir = $self->dir."/zoneinfo_$type";
1985 0 0         unless($self->{"zoneinfo_built_$type"}) {
1986 0           filter("", "make", "-C", $self->unpacked_dir,
1987             "${type}_only", "TZDIR=$zidir", "VERSION_DEPS=");
1988 0           my %expect_names = %{$self->all_names};
  0            
1989 0           my $skiplen = length($zidir) + 1;
1990             _foreach_nondir_under($zidir, sub {
1991 0     0     my($fname) = @_;
1992 0           my $lname = substr($fname, $skiplen);
1993 0 0         unless(exists $expect_names{$lname}) {
1994 0           die "unexpected file $lname\n";
1995             }
1996 0           delete $expect_names{$lname};
1997 0           });
1998 0 0         if(keys %expect_names) {
1999 0           die "missing file @{[(sort keys %expect_names)[0]]}\n";
  0            
2000             }
2001 0           $self->{"zoneinfo_built_$type"} = 1;
2002             }
2003 0           return $zidir;
2004             }
2005              
2006             =back
2007              
2008             =head1 BUGS
2009              
2010             Most of what this class does will only work on Unix platforms. This is
2011             largely because the Olson database source is heavily Unix-oriented.
2012              
2013             This class also depends on the availability of some tools beyond
2014             baseline Unix. Specifically, it requires GNU C, GNU C,
2015             C, C, and GNU C.
2016              
2017             It also won't be much good if you're not connected to the Internet.
2018              
2019             This class is liable to break if the format of the Olson database source
2020             ever changes substantially. If that happens, an update of this class
2021             will be required. It should at least recognise that it can't perform,
2022             rather than do the wrong thing.
2023              
2024             =head1 SEE ALSO
2025              
2026             L,
2027             L,
2028             L
2029              
2030             =head1 AUTHOR
2031              
2032             Andrew Main (Zefram)
2033              
2034             =head1 COPYRIGHT
2035              
2036             Copyright (C) 2010, 2011, 2012, 2017, 2018
2037             Andrew Main (Zefram)
2038              
2039             =head1 LICENSE
2040              
2041             This module is free software; you can redistribute it and/or modify it
2042             under the same terms as Perl itself.
2043              
2044             =cut
2045              
2046             1;