From b0df6c1fce30086bb2cefdd0079392fc2ad80edd Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sat, 4 May 2024 23:05:36 -0700 Subject: [PATCH] Implement proper time zone support Cosmopolitan now supports 104 time zones. They're embedded inside any binary that links the localtime() function. Doing so adds about 100kb to the binary size. This change also gets time zones working properly on Windows for the first time. It's not needed to have /etc/localtime exist on Windows, since we can get this information from WIN32. We're also now updated to the latest version of Paul Eggert's TZ library. --- Makefile | 5 +- dsp/mpeg/BUILD.mk | 1 - dsp/mpeg/mpeg1.c | 2 +- dsp/scale/BUILD.mk | 1 - dsp/tty/BUILD.mk | 1 - examples/BUILD.mk | 2 +- examples/date.c | 29 +- examples/hangman.c | 2 +- examples/kilo.c | 2 +- examples/localtime.c | 15 + examples/nesemu1.cc | 2 +- examples/script.c | 2 +- examples/setitimer.c | 2 +- examples/stat.c | 41 +- examples/wall.c | 2 +- libc/BUILD.mk | 1 - libc/calls/clock_getres.c | 2 +- libc/{time => calls}/futimesat.c | 0 libc/calls/gettimeofday.c | 2 +- libc/calls/settimeofday.c | 2 +- libc/calls/sleep.c | 2 +- libc/calls/stime.c | 2 +- libc/calls/struct/timeval.h | 2 +- libc/calls/struct/timeval.internal.h | 2 +- libc/calls/time.c | 2 +- libc/calls/timespec_get.c | 2 +- libc/calls/timespec_getres.c | 2 +- libc/calls/usleep.c | 2 +- libc/calls/utime.c | 2 +- libc/calls/utimensat-nt.c | 2 +- libc/calls/utimensat-sysv.c | 2 +- libc/intrin/BUILD.mk | 8 + libc/{time => intrin}/kmonthname.S | 0 libc/{time => intrin}/kmonthnameshort.S | 0 libc/{time => intrin}/kweekdayname.S | 0 libc/{time => intrin}/kweekdaynameshort.S | 0 libc/intrin/ubsan.c | 3 + libc/intrin/ubsan.h | 8 + libc/{time/timezone.c => intrin/ubsanconf.c} | 10 +- libc/isystem/sys/stat.h | 2 +- libc/isystem/sys/time.h | 3 +- libc/isystem/time.h | 3 +- libc/isystem/unistd.h | 2 +- libc/isystem/utime.h | 3 +- libc/isystem/wchar.h | 2 +- libc/log/BUILD.mk | 4 +- libc/log/vflogf.c | 3 +- libc/nt/enum/timezoneid.h | 8 + .../kernel32/GetDynamicTimeZoneInformation.S | 20 + libc/nt/kernel32/GetTimeZoneInformation.S | 20 + libc/nt/master.sh | 2 + libc/nt/struct/dynamictimezoneinformation.h | 17 + libc/nt/struct/timezoneinformation.h | 15 + libc/nt/time.h | 37 + libc/proc/clock.c | 2 +- libc/proc/times.c | 2 +- libc/runtime/hog.py | 2 + libc/sock/BUILD.mk | 2 +- libc/sock/syslog.c | 2 +- libc/stdio/BUILD.mk | 6 + libc/stdio/vfprintf_unlocked.c | 1 + libc/str/BUILD.mk | 7 + libc/str/dosdatetimetounix.c | 2 +- libc/{time => str}/iso8601.c | 3 +- libc/{time => str}/iso8601us.c | 3 +- libc/str/kmonthyearday.c | 2 +- libc/str/locale.h | 4 +- libc/testlib/BUILD.mk | 4 +- libc/testlib/testmain.c | 2 + libc/thread/setitimer.c | 2 +- libc/{time/struct/tm.h => time.h} | 37 +- libc/time/BUILD.mk | 96 -- libc/time/clockstonanos.internal.h | 13 - libc/time/ctime.c | 18 - libc/time/ctime_r.c | 9 - libc/time/strptime.c | 274 ---- libc/time/struct/timezone.h | 11 - libc/time/struct/utimbuf.h | 13 - libc/time/struct/utimbuf.internal.h | 9 - libc/time/time.h | 29 - libc/time/tz.internal.h | 539 ------ libc/time/xiso8601.c | 76 - libc/utime.h | 17 + libc/x/xiso8601.h | 17 - net/http/BUILD.mk | 3 +- net/http/formathttpdatetime.c | 3 +- net/http/http.h | 2 +- net/http/parsehttpdatetime.c | 2 +- net/https/BUILD.mk | 4 +- net/https/choosecertificatelifetime.c | 2 +- net/https/https.h | 2 +- net/turfwar/BUILD.mk | 2 +- net/turfwar/blackholed.c | 4 +- net/turfwar/turfwar.c | 2 +- test/libc/calls/BUILD.mk | 4 +- test/libc/calls/clock_getres_test.c | 2 +- test/libc/calls/clock_gettime_test.c | 2 +- test/libc/calls/clock_nanosleep_test.c | 2 +- test/libc/calls/getitimer_test.c | 2 +- test/libc/calls/pledge_test.c | 2 +- test/libc/calls/readansi_test.c | 2 +- test/libc/calls/reservefd_test.c | 5 +- test/libc/calls/setrlimit_test.c | 2 +- test/libc/calls/utimensat_test.c | 2 +- test/libc/fmt/timevaltofiletime_test.c | 2 +- test/libc/intrin/lockscale_test.c | 2 +- test/libc/mem/malloc_test.c | 2 +- test/libc/release/smoke.c | 1 - test/libc/sock/select_test.c | 2 +- test/libc/sock/unix_test.c | 2 +- test/libc/stdio/BUILD.mk | 4 +- test/libc/stdio/dirstream_test.c | 9 +- test/libc/stdio/fwrite_test.c | 2 +- test/libc/stdio/zipdir_test.c | 2 +- test/libc/thread/BUILD.mk | 4 +- test/libc/thread/setitimer_test.c | 2 +- test/libc/time/BUILD.mk | 5 +- test/libc/time/iso8601_test.c | 3 +- test/libc/time/strftime_test.c | 17 +- test/net/http/BUILD.mk | 8 +- test/net/http/formathttpdatetime_test.c | 21 +- test/net/http/parsehttpdatetime_test.c | 3 +- test/net/https/BUILD.mk | 8 +- test/tool/net/lunix_test.lua | 2 +- test/tool/viz/lib/BUILD.mk | 4 +- test/tool/viz/lib/ycbcr2rgb2_test.c | 2 +- third_party/BUILD.mk | 1 + third_party/bash/BUILD.mk | 4 +- third_party/bzip2/bzip2.c | 4 +- third_party/chibicc/BUILD.mk | 6 +- third_party/chibicc/chibicc.h | 3 +- third_party/ctags/entry.c | 2 +- third_party/ctags/main.c | 2 +- third_party/finger/BUILD.mk | 4 +- third_party/finger/finger.c | 2 +- third_party/finger/lprint.c | 3 +- third_party/finger/sprint.c | 3 +- third_party/hiredis/BUILD.mk | 1 - third_party/hiredis/hiredis.h | 3 +- third_party/hiredis/read.c | 2 +- third_party/libcxx/BUILD.mk | 4 +- third_party/libcxx/__mutex_base | 3 +- third_party/libcxx/chrono.cc | 2 +- third_party/libcxx/cwchar | 3 +- third_party/lua/BUILD.mk | 8 +- third_party/lua/loslib.c | 3 +- third_party/lua/lstate.c | 2 +- third_party/lua/lunix.c | 3 +- third_party/lz4cli/BUILD.mk | 3 +- third_party/lz4cli/bench.c | 2 +- third_party/lz4cli/util.h | 6 +- third_party/make/BUILD.mk | 4 +- third_party/mbedtls/BUILD.mk | 2 +- third_party/mbedtls/ssl_cache.c | 2 +- third_party/mbedtls/ssl_cli.c | 2 +- third_party/mbedtls/ssl_srv.c | 2 +- third_party/mbedtls/ssl_ticket.c | 2 +- third_party/mbedtls/test/BUILD.mk | 2 +- third_party/mbedtls/test/everest_unravaged.c | 2 +- third_party/mbedtls/test/lib.c | 2 +- third_party/mbedtls/test/test_suite_ssl.c | 2 +- third_party/mbedtls/x509.c | 3 +- third_party/musl/strptime.c | 275 ++++ third_party/musl/tempnam.c | 2 +- third_party/python/BUILD.mk | 6 +- third_party/python/Include/pytime.h | 2 +- .../python/Lib/test/test_statistics.py | 2 +- third_party/python/Lib/test/test_time.py | 4 +- third_party/python/Modules/_datetimemodule.c | 2 +- third_party/python/Modules/_lsprof.c | 3 +- third_party/python/Modules/_testcapimodule.c | 2 +- third_party/python/Modules/_threadmodule.c | 3 +- third_party/python/Modules/expat/xmlparse.c | 2 +- third_party/python/Modules/posixmodule.c | 4 +- third_party/python/Modules/signalmodule.c | 2 +- third_party/python/Modules/timemodule.c | 3 +- third_party/python/Modules/xxsubtype.c | 2 +- third_party/python/Modules/zipimport.c | 3 +- third_party/python/Python/condvar.h | 2 +- third_party/python/Python/pytime.c | 2 +- third_party/python/pyobj.c | 2 +- third_party/python/runpythonmodule.c | 2 +- third_party/sed/compile.c | 4 +- third_party/smallz4/smallz4.cc | 2 +- third_party/sqlite3/BUILD.mk | 2 +- third_party/sqlite3/date.c | 3 +- third_party/sqlite3/fileio.c | 2 +- third_party/sqlite3/os_unix.c | 5 +- third_party/sqlite3/shell.c | 2 +- third_party/tidy/tidy-int.h | 2 +- third_party/tidy/tidylib.c | 2 +- third_party/tree/BUILD.mk | 4 +- third_party/tz/BUILD.mk | 434 +++++ third_party/tz/LICENSE | 5 + third_party/tz/README.cosmo | 25 + {libc/time => third_party/tz}/asctime.c | 91 +- third_party/tz/ctime.c | 22 + third_party/tz/ctime_r.c | 13 + third_party/tz/daylight.c | 6 + {libc/time => third_party/tz}/difftime.c | 30 +- {libc/time => third_party/tz}/localtime.c | 1450 ++++++++++++----- third_party/tz/private.h | 165 ++ {libc/time => third_party/tz}/strftime.c | 325 ++-- third_party/tz/timezone.c | 6 + third_party/tz/tzdir.h | 6 + .../tz/tzfile.h | 37 +- third_party/tz/tzname.c | 6 + third_party/tz/windows.py | 163 ++ third_party/unzip/BUILD.mk | 4 +- third_party/unzip/timezone.c | 2 +- third_party/unzip/unix.c | 4 +- third_party/unzip/unxcfg.h | 2 +- third_party/xxhash/BUILD.mk | 2 +- third_party/xxhash/cli/xsum_bench.c | 3 +- third_party/xxhash/cli/xsum_config.h | 4 +- third_party/xxhash/cli/xsum_os_specific.c | 6 +- third_party/xxhash/tests/bench/timefn.h | 6 +- third_party/xxhash/tests/collisions/main.c | 3 +- third_party/zip/BUILD.mk | 2 +- third_party/zip/crypt.c | 3 +- third_party/zip/fileio.c | 3 +- third_party/zip/osdep.h | 2 +- third_party/zip/tailor.h | 4 +- third_party/zip/unix.c | 6 +- third_party/zip/zip.c | 3 +- third_party/zstd/BUILD.mk | 1 - .../zstd/lib/compress/zstdmt_compress.c | 2 +- third_party/zstd/lib/dictBuilder/cover.c | 3 +- third_party/zstd/lib/dictBuilder/cover.h | 3 +- third_party/zstd/lib/dictBuilder/fastcover.c | 3 +- third_party/zstd/lib/dictBuilder/zdict.c | 3 +- third_party/zstd/programs/fileio.c | 5 +- third_party/zstd/programs/fileio_asyncio.c | 2 +- third_party/zstd/programs/platform.h | 8 +- third_party/zstd/programs/timefn.c | 3 +- third_party/zstd/programs/util.c | 11 +- third_party/zstd/programs/util.h | 4 +- tool/build/BUILD.mk | 2 +- tool/build/compile.c | 2 +- tool/build/lib/BUILD.mk | 4 +- tool/build/lib/elfwriter_zip.c | 3 +- tool/build/runitd.c | 3 +- tool/build/zipobj.c | 2 +- tool/curl/BUILD.mk | 4 +- tool/decode/BUILD.mk | 2 +- tool/decode/zip.c | 37 +- tool/emacs/cosmo-stuff.el | 2 +- tool/net/BUILD.mk | 2 +- tool/net/lfuncs.c | 2 +- tool/plinko/lib/plinko.c | 8 +- tool/plinko/lib/printf.c | 8 +- tool/viz/BUILD.mk | 2 +- tool/viz/cpuid.c | 2 +- tool/viz/lib/BUILD.mk | 4 +- tool/viz/lib/sharpen.c | 2 +- tool/viz/lib/unsharp.c | 2 +- tool/viz/lib/ycbcr2rgb3.c | 2 +- tool/viz/life.c | 2 +- tool/viz/memzoom.c | 2 +- tool/viz/printpeb.c | 2 +- tool/viz/printvideo.c | 2 +- tool/viz/tailf.c | 2 +- usr/share/zoneinfo/Africa/Abidjan | Bin 0 -> 130 bytes usr/share/zoneinfo/Africa/Algiers | Bin 0 -> 470 bytes usr/share/zoneinfo/Africa/Bissau | Bin 0 -> 149 bytes usr/share/zoneinfo/Africa/Cairo | Bin 0 -> 1309 bytes usr/share/zoneinfo/Africa/Casablanca | Bin 0 -> 1919 bytes usr/share/zoneinfo/Africa/Ceuta | Bin 0 -> 562 bytes usr/share/zoneinfo/Africa/El_Aaiun | Bin 0 -> 1830 bytes usr/share/zoneinfo/Africa/Johannesburg | Bin 0 -> 190 bytes usr/share/zoneinfo/Africa/Juba | Bin 0 -> 458 bytes usr/share/zoneinfo/Africa/Khartoum | Bin 0 -> 458 bytes usr/share/zoneinfo/Africa/Lagos | Bin 0 -> 180 bytes usr/share/zoneinfo/Africa/Maputo | Bin 0 -> 131 bytes usr/share/zoneinfo/Africa/Monrovia | Bin 0 -> 164 bytes usr/share/zoneinfo/Africa/Nairobi | Bin 0 -> 191 bytes usr/share/zoneinfo/Africa/Ndjamena | Bin 0 -> 160 bytes usr/share/zoneinfo/Africa/Sao_Tome | Bin 0 -> 173 bytes usr/share/zoneinfo/Africa/Tripoli | Bin 0 -> 431 bytes usr/share/zoneinfo/Africa/Tunis | Bin 0 -> 449 bytes usr/share/zoneinfo/Africa/Windhoek | Bin 0 -> 638 bytes .../zoneinfo/{US/Aleutian => America/Adak} | Bin .../zoneinfo/{US/Alaska => America/Anchorage} | Bin usr/share/zoneinfo/America/Araguaina | Bin 0 -> 592 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 708 bytes .../zoneinfo/America/Argentina/Catamarca | Bin 0 -> 708 bytes usr/share/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 708 bytes usr/share/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 690 bytes usr/share/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 717 bytes usr/share/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 708 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 708 bytes usr/share/zoneinfo/America/Argentina/Salta | Bin 0 -> 690 bytes usr/share/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 717 bytes usr/share/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 717 bytes usr/share/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 726 bytes usr/share/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 708 bytes usr/share/zoneinfo/America/Asuncion | Bin 0 -> 884 bytes usr/share/zoneinfo/America/Bahia | Bin 0 -> 682 bytes usr/share/zoneinfo/America/Bahia_Banderas | Bin 0 -> 728 bytes usr/share/zoneinfo/America/Barbados | Bin 0 -> 278 bytes usr/share/zoneinfo/America/Belem | Bin 0 -> 394 bytes usr/share/zoneinfo/America/Belize | Bin 0 -> 1045 bytes usr/share/zoneinfo/America/Boa_Vista | Bin 0 -> 430 bytes usr/share/zoneinfo/America/Bogota | Bin 0 -> 179 bytes usr/share/zoneinfo/America/Boise | Bin 0 -> 999 bytes usr/share/zoneinfo/America/Cambridge_Bay | Bin 0 -> 883 bytes usr/share/zoneinfo/America/Campo_Grande | Bin 0 -> 952 bytes usr/share/zoneinfo/America/Cancun | Bin 0 -> 529 bytes usr/share/zoneinfo/America/Caracas | Bin 0 -> 190 bytes usr/share/zoneinfo/America/Cayenne | Bin 0 -> 151 bytes .../zoneinfo/{US/Central => America/Chicago} | Bin usr/share/zoneinfo/America/Chihuahua | Bin 0 -> 691 bytes usr/share/zoneinfo/America/Ciudad_Juarez | Bin 0 -> 718 bytes usr/share/zoneinfo/America/Costa_Rica | Bin 0 -> 232 bytes usr/share/zoneinfo/America/Cuiaba | Bin 0 -> 934 bytes usr/share/zoneinfo/America/Danmarkshavn | Bin 0 -> 447 bytes usr/share/zoneinfo/America/Dawson | Bin 0 -> 1029 bytes usr/share/zoneinfo/America/Dawson_Creek | Bin 0 -> 683 bytes .../zoneinfo/{US/Mountain => America/Denver} | Bin .../zoneinfo/{US/Michigan => America/Detroit} | Bin usr/share/zoneinfo/America/Edmonton | Bin 0 -> 970 bytes usr/share/zoneinfo/America/Eirunepe | Bin 0 -> 436 bytes usr/share/zoneinfo/America/El_Salvador | Bin 0 -> 176 bytes usr/share/zoneinfo/America/Fort_Nelson | Bin 0 -> 1448 bytes usr/share/zoneinfo/America/Fortaleza | Bin 0 -> 484 bytes usr/share/zoneinfo/America/Glace_Bay | Bin 0 -> 880 bytes usr/share/zoneinfo/America/Goose_Bay | Bin 0 -> 1580 bytes usr/share/zoneinfo/America/Grand_Turk | Bin 0 -> 853 bytes usr/share/zoneinfo/America/Guatemala | Bin 0 -> 212 bytes usr/share/zoneinfo/America/Guayaquil | Bin 0 -> 179 bytes usr/share/zoneinfo/America/Guyana | Bin 0 -> 181 bytes usr/share/zoneinfo/America/Halifax | Bin 0 -> 1672 bytes usr/share/zoneinfo/America/Havana | Bin 0 -> 1117 bytes usr/share/zoneinfo/America/Hermosillo | Bin 0 -> 286 bytes .../Indiana/Indianapolis} | Bin .../Indiana-Starke => America/Indiana/Knox} | Bin usr/share/zoneinfo/America/Indiana/Marengo | Bin 0 -> 567 bytes usr/share/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 683 bytes usr/share/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 522 bytes usr/share/zoneinfo/America/Indiana/Vevay | Bin 0 -> 369 bytes usr/share/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 558 bytes usr/share/zoneinfo/America/Indiana/Winamac | Bin 0 -> 603 bytes usr/share/zoneinfo/America/Inuvik | Bin 0 -> 817 bytes usr/share/zoneinfo/America/Iqaluit | Bin 0 -> 855 bytes usr/share/zoneinfo/America/Jamaica | Bin 0 -> 339 bytes usr/share/zoneinfo/America/Juneau | Bin 0 -> 966 bytes .../zoneinfo/America/Kentucky/Louisville | Bin 0 -> 1242 bytes .../zoneinfo/America/Kentucky/Monticello | Bin 0 -> 972 bytes usr/share/zoneinfo/America/La_Paz | Bin 0 -> 170 bytes usr/share/zoneinfo/America/Lima | Bin 0 -> 283 bytes .../{US/Pacific => America/Los_Angeles} | Bin usr/share/zoneinfo/America/Maceio | Bin 0 -> 502 bytes usr/share/zoneinfo/America/Managua | Bin 0 -> 295 bytes usr/share/zoneinfo/America/Manaus | Bin 0 -> 412 bytes usr/share/zoneinfo/America/Martinique | Bin 0 -> 178 bytes usr/share/zoneinfo/America/Matamoros | Bin 0 -> 437 bytes usr/share/zoneinfo/America/Mazatlan | Bin 0 -> 718 bytes usr/share/zoneinfo/America/Menominee | Bin 0 -> 917 bytes usr/share/zoneinfo/America/Merida | Bin 0 -> 654 bytes usr/share/zoneinfo/America/Metlakatla | Bin 0 -> 586 bytes usr/share/zoneinfo/America/Mexico_City | Bin 0 -> 773 bytes usr/share/zoneinfo/America/Miquelon | Bin 0 -> 550 bytes usr/share/zoneinfo/America/Moncton | Bin 0 -> 1493 bytes usr/share/zoneinfo/America/Monterrey | Bin 0 -> 644 bytes usr/share/zoneinfo/America/Montevideo | Bin 0 -> 969 bytes .../zoneinfo/{US/Eastern => America/New_York} | Bin usr/share/zoneinfo/America/Nome | Bin 0 -> 975 bytes usr/share/zoneinfo/America/Noronha | Bin 0 -> 484 bytes .../zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 1043 bytes .../zoneinfo/America/North_Dakota/Center | Bin 0 -> 990 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 990 bytes usr/share/zoneinfo/America/Nuuk | Bin 0 -> 965 bytes usr/share/zoneinfo/America/Ojinaga | Bin 0 -> 718 bytes usr/share/zoneinfo/America/Panama | Bin 0 -> 149 bytes usr/share/zoneinfo/America/Paramaribo | Bin 0 -> 187 bytes .../zoneinfo/{US/Arizona => America/Phoenix} | Bin usr/share/zoneinfo/America/Port-au-Prince | Bin 0 -> 565 bytes usr/share/zoneinfo/America/Porto_Velho | Bin 0 -> 394 bytes usr/share/zoneinfo/America/Puerto_Rico | Bin 0 -> 177 bytes usr/share/zoneinfo/America/Punta_Arenas | Bin 0 -> 1218 bytes usr/share/zoneinfo/America/Rankin_Inlet | Bin 0 -> 807 bytes usr/share/zoneinfo/America/Recife | Bin 0 -> 484 bytes usr/share/zoneinfo/America/Regina | Bin 0 -> 638 bytes usr/share/zoneinfo/America/Resolute | Bin 0 -> 807 bytes usr/share/zoneinfo/America/Rio_Branco | Bin 0 -> 418 bytes usr/share/zoneinfo/America/Santarem | Bin 0 -> 409 bytes usr/share/zoneinfo/America/Santiago | Bin 0 -> 1354 bytes usr/share/zoneinfo/America/Santo_Domingo | Bin 0 -> 317 bytes usr/share/zoneinfo/America/Sao_Paulo | Bin 0 -> 952 bytes usr/share/zoneinfo/America/Scoresbysund | Bin 0 -> 984 bytes usr/share/zoneinfo/America/Sitka | Bin 0 -> 956 bytes usr/share/zoneinfo/America/St_Johns | Bin 0 -> 1878 bytes usr/share/zoneinfo/America/Swift_Current | Bin 0 -> 368 bytes usr/share/zoneinfo/America/Tegucigalpa | Bin 0 -> 194 bytes usr/share/zoneinfo/America/Thule | Bin 0 -> 455 bytes usr/share/zoneinfo/America/Tijuana | Bin 0 -> 1025 bytes usr/share/zoneinfo/America/Toronto | Bin 0 -> 1717 bytes usr/share/zoneinfo/America/Vancouver | Bin 0 -> 1330 bytes usr/share/zoneinfo/America/Whitehorse | Bin 0 -> 1029 bytes usr/share/zoneinfo/America/Winnipeg | Bin 0 -> 1294 bytes usr/share/zoneinfo/America/Yakutat | Bin 0 -> 946 bytes usr/share/zoneinfo/Anchorage | 1 - usr/share/zoneinfo/Antarctica/Casey | Bin 0 -> 287 bytes usr/share/zoneinfo/Antarctica/Davis | Bin 0 -> 197 bytes usr/share/zoneinfo/Antarctica/Macquarie | Bin 0 -> 976 bytes usr/share/zoneinfo/Antarctica/Mawson | Bin 0 -> 152 bytes usr/share/zoneinfo/Antarctica/Palmer | Bin 0 -> 887 bytes usr/share/zoneinfo/Antarctica/Rothera | Bin 0 -> 132 bytes usr/share/zoneinfo/Antarctica/Troll | Bin 0 -> 158 bytes usr/share/zoneinfo/Antarctica/Vostok | Bin 0 -> 170 bytes usr/share/zoneinfo/Asia/Almaty | Bin 0 -> 618 bytes usr/share/zoneinfo/Asia/Amman | Bin 0 -> 928 bytes usr/share/zoneinfo/Asia/Anadyr | Bin 0 -> 743 bytes usr/share/zoneinfo/Asia/Aqtau | Bin 0 -> 606 bytes usr/share/zoneinfo/Asia/Aqtobe | Bin 0 -> 615 bytes usr/share/zoneinfo/Asia/Ashgabat | Bin 0 -> 375 bytes usr/share/zoneinfo/Asia/Atyrau | Bin 0 -> 616 bytes usr/share/zoneinfo/Asia/Baghdad | Bin 0 -> 630 bytes usr/share/zoneinfo/Asia/Baku | Bin 0 -> 744 bytes usr/share/zoneinfo/Asia/Bangkok | Bin 0 -> 152 bytes usr/share/zoneinfo/Asia/Barnaul | Bin 0 -> 753 bytes usr/share/zoneinfo/Asia/Beirut | Bin 0 -> 732 bytes usr/share/zoneinfo/Asia/Bishkek | Bin 0 -> 618 bytes usr/share/zoneinfo/Asia/Chita | Bin 0 -> 750 bytes usr/share/zoneinfo/Asia/Choibalsan | Bin 0 -> 619 bytes usr/share/zoneinfo/Asia/Colombo | Bin 0 -> 247 bytes usr/share/zoneinfo/Asia/Damascus | Bin 0 -> 1234 bytes usr/share/zoneinfo/Asia/Dhaka | Bin 0 -> 231 bytes usr/share/zoneinfo/Asia/Dili | Bin 0 -> 170 bytes usr/share/zoneinfo/Asia/Dubai | Bin 0 -> 133 bytes usr/share/zoneinfo/Asia/Dushanbe | Bin 0 -> 366 bytes usr/share/zoneinfo/Asia/Famagusta | Bin 0 -> 940 bytes usr/share/zoneinfo/Asia/Gaza | Bin 0 -> 2950 bytes usr/share/zoneinfo/Asia/Hebron | Bin 0 -> 2968 bytes usr/share/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 236 bytes usr/share/zoneinfo/Asia/Hong_Kong | Bin 0 -> 775 bytes usr/share/zoneinfo/Asia/Hovd | Bin 0 -> 594 bytes usr/share/zoneinfo/Asia/Irkutsk | Bin 0 -> 760 bytes usr/share/zoneinfo/Asia/Jakarta | Bin 0 -> 248 bytes usr/share/zoneinfo/Asia/Jayapura | Bin 0 -> 171 bytes usr/share/zoneinfo/{Israel => Asia/Jerusalem} | Bin usr/share/zoneinfo/Asia/Kabul | Bin 0 -> 159 bytes usr/share/zoneinfo/Asia/Kamchatka | Bin 0 -> 727 bytes usr/share/zoneinfo/Asia/Karachi | Bin 0 -> 266 bytes usr/share/zoneinfo/Asia/Kathmandu | Bin 0 -> 161 bytes usr/share/zoneinfo/Asia/Khandyga | Bin 0 -> 775 bytes usr/share/zoneinfo/Asia/Kolkata | Bin 0 -> 220 bytes usr/share/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 741 bytes usr/share/zoneinfo/Asia/Kuching | Bin 0 -> 320 bytes usr/share/zoneinfo/Asia/Macau | Bin 0 -> 791 bytes usr/share/zoneinfo/Asia/Magadan | Bin 0 -> 751 bytes usr/share/zoneinfo/Asia/Makassar | Bin 0 -> 190 bytes usr/share/zoneinfo/Asia/Manila | Bin 0 -> 238 bytes usr/share/zoneinfo/Asia/Nicosia | Bin 0 -> 597 bytes usr/share/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 726 bytes usr/share/zoneinfo/Asia/Novosibirsk | Bin 0 -> 753 bytes usr/share/zoneinfo/Asia/Omsk | Bin 0 -> 741 bytes usr/share/zoneinfo/Asia/Oral | Bin 0 -> 625 bytes usr/share/zoneinfo/Asia/Pontianak | Bin 0 -> 247 bytes usr/share/zoneinfo/Asia/Pyongyang | Bin 0 -> 183 bytes usr/share/zoneinfo/Asia/Qatar | Bin 0 -> 152 bytes usr/share/zoneinfo/Asia/Qostanay | Bin 0 -> 624 bytes usr/share/zoneinfo/Asia/Qyzylorda | Bin 0 -> 624 bytes usr/share/zoneinfo/Asia/Riyadh | Bin 0 -> 133 bytes usr/share/zoneinfo/Asia/Sakhalin | Bin 0 -> 755 bytes usr/share/zoneinfo/Asia/Samarkand | Bin 0 -> 366 bytes usr/share/zoneinfo/Asia/Seoul | Bin 0 -> 415 bytes usr/share/zoneinfo/Asia/Shanghai | Bin 0 -> 393 bytes usr/share/zoneinfo/{ => Asia}/Singapore | Bin usr/share/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 742 bytes usr/share/zoneinfo/Asia/Taipei | Bin 0 -> 511 bytes usr/share/zoneinfo/Asia/Tashkent | Bin 0 -> 366 bytes usr/share/zoneinfo/Asia/Tbilisi | Bin 0 -> 629 bytes usr/share/zoneinfo/Asia/Tehran | Bin 0 -> 812 bytes usr/share/zoneinfo/Asia/Thimphu | Bin 0 -> 154 bytes usr/share/zoneinfo/Asia/Tokyo | Bin 0 -> 213 bytes usr/share/zoneinfo/Asia/Tomsk | Bin 0 -> 753 bytes usr/share/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 594 bytes usr/share/zoneinfo/Asia/Urumqi | Bin 0 -> 133 bytes usr/share/zoneinfo/Asia/Ust-Nera | Bin 0 -> 771 bytes usr/share/zoneinfo/Asia/Vladivostok | Bin 0 -> 742 bytes usr/share/zoneinfo/Asia/Yakutsk | Bin 0 -> 741 bytes usr/share/zoneinfo/Asia/Yangon | Bin 0 -> 187 bytes usr/share/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 760 bytes usr/share/zoneinfo/Asia/Yerevan | Bin 0 -> 708 bytes usr/share/zoneinfo/Atlantic/Azores | Bin 0 -> 1453 bytes usr/share/zoneinfo/Atlantic/Bermuda | Bin 0 -> 1024 bytes usr/share/zoneinfo/Atlantic/Canary | Bin 0 -> 478 bytes usr/share/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 175 bytes usr/share/zoneinfo/Atlantic/Faroe | Bin 0 -> 441 bytes usr/share/zoneinfo/Atlantic/Madeira | Bin 0 -> 1453 bytes usr/share/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 132 bytes usr/share/zoneinfo/Atlantic/Stanley | Bin 0 -> 789 bytes usr/share/zoneinfo/Australia/Adelaide | Bin 0 -> 921 bytes usr/share/zoneinfo/Australia/Brisbane | Bin 0 -> 289 bytes usr/share/zoneinfo/Australia/Broken_Hill | Bin 0 -> 941 bytes usr/share/zoneinfo/Australia/Darwin | Bin 0 -> 234 bytes usr/share/zoneinfo/Australia/Eucla | Bin 0 -> 314 bytes usr/share/zoneinfo/Australia/Hobart | Bin 0 -> 1003 bytes usr/share/zoneinfo/Australia/Lindeman | Bin 0 -> 325 bytes usr/share/zoneinfo/Australia/Lord_Howe | Bin 0 -> 692 bytes usr/share/zoneinfo/Australia/Melbourne | Bin 0 -> 904 bytes usr/share/zoneinfo/Australia/Perth | Bin 0 -> 306 bytes usr/share/zoneinfo/Australia/Sydney | Bin 0 -> 904 bytes usr/share/zoneinfo/Beijing | Bin 582 -> 0 bytes usr/share/zoneinfo/Berlin | Bin 2335 -> 0 bytes usr/share/zoneinfo/Boulder | 1 - usr/share/zoneinfo/CET | Bin 0 -> 621 bytes usr/share/zoneinfo/CST6CDT | Bin 0 -> 951 bytes usr/share/zoneinfo/Chicago | 1 - usr/share/zoneinfo/EET | Bin 0 -> 497 bytes usr/share/zoneinfo/EST | Bin 0 -> 111 bytes usr/share/zoneinfo/EST5EDT | Bin 0 -> 951 bytes usr/share/zoneinfo/{UTC => Etc/GMT} | Bin usr/share/zoneinfo/Etc/GMT+1 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+10 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT+11 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT+12 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT+2 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+3 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+4 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+5 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+6 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+7 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+8 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT+9 | Bin 0 -> 113 bytes usr/share/zoneinfo/Etc/GMT-1 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-10 | Bin 0 -> 115 bytes usr/share/zoneinfo/Etc/GMT-11 | Bin 0 -> 115 bytes usr/share/zoneinfo/Etc/GMT-12 | Bin 0 -> 115 bytes usr/share/zoneinfo/Etc/GMT-13 | Bin 0 -> 115 bytes usr/share/zoneinfo/Etc/GMT-14 | Bin 0 -> 115 bytes usr/share/zoneinfo/Etc/GMT-2 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-3 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-4 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-5 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-6 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-7 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-8 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/GMT-9 | Bin 0 -> 114 bytes usr/share/zoneinfo/Etc/UTC | Bin 0 -> 111 bytes usr/share/zoneinfo/Europe/Andorra | Bin 0 -> 389 bytes usr/share/zoneinfo/Europe/Astrakhan | Bin 0 -> 726 bytes usr/share/zoneinfo/Europe/Athens | Bin 0 -> 682 bytes usr/share/zoneinfo/Europe/Belgrade | Bin 0 -> 478 bytes usr/share/zoneinfo/Europe/Berlin | Bin 0 -> 705 bytes usr/share/zoneinfo/Europe/Brussels | Bin 0 -> 1103 bytes usr/share/zoneinfo/Europe/Bucharest | Bin 0 -> 661 bytes usr/share/zoneinfo/Europe/Budapest | Bin 0 -> 766 bytes usr/share/zoneinfo/Europe/Chisinau | Bin 0 -> 755 bytes usr/share/zoneinfo/Europe/Dublin | Bin 0 -> 1496 bytes usr/share/zoneinfo/Europe/Gibraltar | Bin 0 -> 1220 bytes usr/share/zoneinfo/Europe/Helsinki | Bin 0 -> 481 bytes usr/share/zoneinfo/Europe/Istanbul | Bin 0 -> 1200 bytes usr/share/zoneinfo/Europe/Kaliningrad | Bin 0 -> 904 bytes usr/share/zoneinfo/Europe/Kirov | Bin 0 -> 735 bytes usr/share/zoneinfo/Europe/Kyiv | Bin 0 -> 558 bytes usr/share/zoneinfo/Europe/Lisbon | Bin 0 -> 1454 bytes usr/share/zoneinfo/Europe/London | Bin 0 -> 1599 bytes usr/share/zoneinfo/Europe/Madrid | Bin 0 -> 897 bytes usr/share/zoneinfo/Europe/Malta | Bin 0 -> 928 bytes usr/share/zoneinfo/Europe/Minsk | Bin 0 -> 808 bytes usr/share/zoneinfo/Europe/Moscow | Bin 0 -> 908 bytes usr/share/zoneinfo/Europe/Paris | Bin 0 -> 1105 bytes usr/share/zoneinfo/Europe/Prague | Bin 0 -> 723 bytes usr/share/zoneinfo/Europe/Riga | Bin 0 -> 694 bytes usr/share/zoneinfo/Europe/Rome | Bin 0 -> 947 bytes usr/share/zoneinfo/Europe/Samara | Bin 0 -> 732 bytes usr/share/zoneinfo/Europe/Saratov | Bin 0 -> 726 bytes usr/share/zoneinfo/Europe/Simferopol | Bin 0 -> 865 bytes usr/share/zoneinfo/Europe/Sofia | Bin 0 -> 592 bytes usr/share/zoneinfo/Europe/Tallinn | Bin 0 -> 675 bytes usr/share/zoneinfo/Europe/Tirane | Bin 0 -> 604 bytes usr/share/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 760 bytes usr/share/zoneinfo/Europe/Vienna | Bin 0 -> 658 bytes usr/share/zoneinfo/Europe/Vilnius | Bin 0 -> 676 bytes usr/share/zoneinfo/Europe/Volgograd | Bin 0 -> 753 bytes usr/share/zoneinfo/Europe/Warsaw | Bin 0 -> 923 bytes usr/share/zoneinfo/Europe/Zurich | Bin 0 -> 497 bytes usr/share/zoneinfo/GMT | Bin 3 -> 111 bytes usr/share/zoneinfo/GST | 1 - usr/share/zoneinfo/HST | Bin 0 -> 112 bytes usr/share/zoneinfo/Honolulu | 1 - usr/share/zoneinfo/India | Bin 285 -> 0 bytes usr/share/zoneinfo/Indian/Chagos | Bin 0 -> 152 bytes usr/share/zoneinfo/Indian/Maldives | Bin 0 -> 152 bytes usr/share/zoneinfo/Indian/Mauritius | Bin 0 -> 179 bytes usr/share/zoneinfo/Japan | Bin 318 -> 0 bytes usr/share/zoneinfo/London | Bin 3687 -> 0 bytes usr/share/zoneinfo/MET | Bin 0 -> 621 bytes usr/share/zoneinfo/MST | Bin 0 -> 111 bytes usr/share/zoneinfo/MST7MDT | Bin 0 -> 951 bytes usr/share/zoneinfo/Melbourne | Bin 2223 -> 0 bytes usr/share/zoneinfo/New_York | 1 - usr/share/zoneinfo/PST8PDT | Bin 0 -> 951 bytes usr/share/zoneinfo/Pacific/Apia | Bin 0 -> 407 bytes usr/share/zoneinfo/Pacific/Auckland | Bin 0 -> 1043 bytes usr/share/zoneinfo/Pacific/Bougainville | Bin 0 -> 201 bytes usr/share/zoneinfo/Pacific/Chatham | Bin 0 -> 808 bytes usr/share/zoneinfo/Pacific/Easter | Bin 0 -> 1174 bytes usr/share/zoneinfo/Pacific/Efate | Bin 0 -> 342 bytes usr/share/zoneinfo/Pacific/Fakaofo | Bin 0 -> 153 bytes usr/share/zoneinfo/Pacific/Fiji | Bin 0 -> 396 bytes usr/share/zoneinfo/Pacific/Galapagos | Bin 0 -> 175 bytes usr/share/zoneinfo/Pacific/Gambier | Bin 0 -> 132 bytes usr/share/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 134 bytes usr/share/zoneinfo/Pacific/Guam | Bin 0 -> 350 bytes .../zoneinfo/{US/Hawaii => Pacific/Honolulu} | Bin usr/share/zoneinfo/Pacific/Kanton | Bin 0 -> 172 bytes usr/share/zoneinfo/Pacific/Kiritimati | Bin 0 -> 174 bytes usr/share/zoneinfo/Pacific/Kosrae | Bin 0 -> 242 bytes usr/share/zoneinfo/Pacific/Kwajalein | Bin 0 -> 219 bytes usr/share/zoneinfo/Pacific/Marquesas | Bin 0 -> 139 bytes usr/share/zoneinfo/Pacific/Nauru | Bin 0 -> 183 bytes usr/share/zoneinfo/Pacific/Niue | Bin 0 -> 154 bytes usr/share/zoneinfo/Pacific/Norfolk | Bin 0 -> 237 bytes usr/share/zoneinfo/Pacific/Noumea | Bin 0 -> 198 bytes .../zoneinfo/{US/Samoa => Pacific/Pago_Pago} | Bin usr/share/zoneinfo/Pacific/Palau | Bin 0 -> 148 bytes usr/share/zoneinfo/Pacific/Pitcairn | Bin 0 -> 153 bytes usr/share/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 154 bytes usr/share/zoneinfo/Pacific/Rarotonga | Bin 0 -> 406 bytes usr/share/zoneinfo/Pacific/Tahiti | Bin 0 -> 133 bytes usr/share/zoneinfo/Pacific/Tarawa | Bin 0 -> 134 bytes usr/share/zoneinfo/Pacific/Tongatapu | Bin 0 -> 237 bytes usr/share/zoneinfo/Sydney | Bin 2221 -> 0 bytes usr/share/zoneinfo/WET | Bin 0 -> 494 bytes 627 files changed, 3052 insertions(+), 2077 deletions(-) create mode 100644 examples/localtime.c rename libc/{time => calls}/futimesat.c (100%) rename libc/{time => intrin}/kmonthname.S (100%) rename libc/{time => intrin}/kmonthnameshort.S (100%) rename libc/{time => intrin}/kweekdayname.S (100%) rename libc/{time => intrin}/kweekdaynameshort.S (100%) create mode 100644 libc/intrin/ubsan.h rename libc/{time/timezone.c => intrin/ubsanconf.c} (91%) create mode 100644 libc/nt/enum/timezoneid.h create mode 100644 libc/nt/kernel32/GetDynamicTimeZoneInformation.S create mode 100644 libc/nt/kernel32/GetTimeZoneInformation.S create mode 100644 libc/nt/struct/dynamictimezoneinformation.h create mode 100644 libc/nt/struct/timezoneinformation.h create mode 100644 libc/nt/time.h create mode 100644 libc/runtime/hog.py rename libc/{time => str}/iso8601.c (98%) rename libc/{time => str}/iso8601us.c (98%) rename libc/{time/struct/tm.h => time.h} (60%) delete mode 100644 libc/time/BUILD.mk delete mode 100644 libc/time/clockstonanos.internal.h delete mode 100644 libc/time/ctime.c delete mode 100644 libc/time/ctime_r.c delete mode 100644 libc/time/strptime.c delete mode 100644 libc/time/struct/timezone.h delete mode 100644 libc/time/struct/utimbuf.h delete mode 100644 libc/time/struct/utimbuf.internal.h delete mode 100644 libc/time/time.h delete mode 100644 libc/time/tz.internal.h delete mode 100644 libc/time/xiso8601.c create mode 100644 libc/utime.h delete mode 100644 libc/x/xiso8601.h create mode 100644 third_party/musl/strptime.c create mode 100644 third_party/tz/BUILD.mk create mode 100644 third_party/tz/LICENSE create mode 100644 third_party/tz/README.cosmo rename {libc/time => third_party/tz}/asctime.c (57%) create mode 100644 third_party/tz/ctime.c create mode 100644 third_party/tz/ctime_r.c create mode 100644 third_party/tz/daylight.c rename {libc/time => third_party/tz}/difftime.c (70%) rename {libc/time => third_party/tz}/localtime.c (50%) create mode 100644 third_party/tz/private.h rename {libc/time => third_party/tz}/strftime.c (64%) create mode 100644 third_party/tz/timezone.c create mode 100644 third_party/tz/tzdir.h rename libc/time/tzfile.internal.h => third_party/tz/tzfile.h (81%) create mode 100644 third_party/tz/tzname.c create mode 100644 third_party/tz/windows.py create mode 100644 usr/share/zoneinfo/Africa/Abidjan create mode 100644 usr/share/zoneinfo/Africa/Algiers create mode 100644 usr/share/zoneinfo/Africa/Bissau create mode 100644 usr/share/zoneinfo/Africa/Cairo create mode 100644 usr/share/zoneinfo/Africa/Casablanca create mode 100644 usr/share/zoneinfo/Africa/Ceuta create mode 100644 usr/share/zoneinfo/Africa/El_Aaiun create mode 100644 usr/share/zoneinfo/Africa/Johannesburg create mode 100644 usr/share/zoneinfo/Africa/Juba create mode 100644 usr/share/zoneinfo/Africa/Khartoum create mode 100644 usr/share/zoneinfo/Africa/Lagos create mode 100644 usr/share/zoneinfo/Africa/Maputo create mode 100644 usr/share/zoneinfo/Africa/Monrovia create mode 100644 usr/share/zoneinfo/Africa/Nairobi create mode 100644 usr/share/zoneinfo/Africa/Ndjamena create mode 100644 usr/share/zoneinfo/Africa/Sao_Tome create mode 100644 usr/share/zoneinfo/Africa/Tripoli create mode 100644 usr/share/zoneinfo/Africa/Tunis create mode 100644 usr/share/zoneinfo/Africa/Windhoek rename usr/share/zoneinfo/{US/Aleutian => America/Adak} (100%) rename usr/share/zoneinfo/{US/Alaska => America/Anchorage} (100%) create mode 100644 usr/share/zoneinfo/America/Araguaina create mode 100644 usr/share/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 usr/share/zoneinfo/America/Argentina/Catamarca create mode 100644 usr/share/zoneinfo/America/Argentina/Cordoba create mode 100644 usr/share/zoneinfo/America/Argentina/Jujuy create mode 100644 usr/share/zoneinfo/America/Argentina/La_Rioja create mode 100644 usr/share/zoneinfo/America/Argentina/Mendoza create mode 100644 usr/share/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 usr/share/zoneinfo/America/Argentina/Salta create mode 100644 usr/share/zoneinfo/America/Argentina/San_Juan create mode 100644 usr/share/zoneinfo/America/Argentina/San_Luis create mode 100644 usr/share/zoneinfo/America/Argentina/Tucuman create mode 100644 usr/share/zoneinfo/America/Argentina/Ushuaia create mode 100644 usr/share/zoneinfo/America/Asuncion create mode 100644 usr/share/zoneinfo/America/Bahia create mode 100644 usr/share/zoneinfo/America/Bahia_Banderas create mode 100644 usr/share/zoneinfo/America/Barbados create mode 100644 usr/share/zoneinfo/America/Belem create mode 100644 usr/share/zoneinfo/America/Belize create mode 100644 usr/share/zoneinfo/America/Boa_Vista create mode 100644 usr/share/zoneinfo/America/Bogota create mode 100644 usr/share/zoneinfo/America/Boise create mode 100644 usr/share/zoneinfo/America/Cambridge_Bay create mode 100644 usr/share/zoneinfo/America/Campo_Grande create mode 100644 usr/share/zoneinfo/America/Cancun create mode 100644 usr/share/zoneinfo/America/Caracas create mode 100644 usr/share/zoneinfo/America/Cayenne rename usr/share/zoneinfo/{US/Central => America/Chicago} (100%) create mode 100644 usr/share/zoneinfo/America/Chihuahua create mode 100644 usr/share/zoneinfo/America/Ciudad_Juarez create mode 100644 usr/share/zoneinfo/America/Costa_Rica create mode 100644 usr/share/zoneinfo/America/Cuiaba create mode 100644 usr/share/zoneinfo/America/Danmarkshavn create mode 100644 usr/share/zoneinfo/America/Dawson create mode 100644 usr/share/zoneinfo/America/Dawson_Creek rename usr/share/zoneinfo/{US/Mountain => America/Denver} (100%) rename usr/share/zoneinfo/{US/Michigan => America/Detroit} (100%) create mode 100644 usr/share/zoneinfo/America/Edmonton create mode 100644 usr/share/zoneinfo/America/Eirunepe create mode 100644 usr/share/zoneinfo/America/El_Salvador create mode 100644 usr/share/zoneinfo/America/Fort_Nelson create mode 100644 usr/share/zoneinfo/America/Fortaleza create mode 100644 usr/share/zoneinfo/America/Glace_Bay create mode 100644 usr/share/zoneinfo/America/Goose_Bay create mode 100644 usr/share/zoneinfo/America/Grand_Turk create mode 100644 usr/share/zoneinfo/America/Guatemala create mode 100644 usr/share/zoneinfo/America/Guayaquil create mode 100644 usr/share/zoneinfo/America/Guyana create mode 100644 usr/share/zoneinfo/America/Halifax create mode 100644 usr/share/zoneinfo/America/Havana create mode 100644 usr/share/zoneinfo/America/Hermosillo rename usr/share/zoneinfo/{US/East-Indiana => America/Indiana/Indianapolis} (100%) rename usr/share/zoneinfo/{US/Indiana-Starke => America/Indiana/Knox} (100%) create mode 100644 usr/share/zoneinfo/America/Indiana/Marengo create mode 100644 usr/share/zoneinfo/America/Indiana/Petersburg create mode 100644 usr/share/zoneinfo/America/Indiana/Tell_City create mode 100644 usr/share/zoneinfo/America/Indiana/Vevay create mode 100644 usr/share/zoneinfo/America/Indiana/Vincennes create mode 100644 usr/share/zoneinfo/America/Indiana/Winamac create mode 100644 usr/share/zoneinfo/America/Inuvik create mode 100644 usr/share/zoneinfo/America/Iqaluit create mode 100644 usr/share/zoneinfo/America/Jamaica create mode 100644 usr/share/zoneinfo/America/Juneau create mode 100644 usr/share/zoneinfo/America/Kentucky/Louisville create mode 100644 usr/share/zoneinfo/America/Kentucky/Monticello create mode 100644 usr/share/zoneinfo/America/La_Paz create mode 100644 usr/share/zoneinfo/America/Lima rename usr/share/zoneinfo/{US/Pacific => America/Los_Angeles} (100%) create mode 100644 usr/share/zoneinfo/America/Maceio create mode 100644 usr/share/zoneinfo/America/Managua create mode 100644 usr/share/zoneinfo/America/Manaus create mode 100644 usr/share/zoneinfo/America/Martinique create mode 100644 usr/share/zoneinfo/America/Matamoros create mode 100644 usr/share/zoneinfo/America/Mazatlan create mode 100644 usr/share/zoneinfo/America/Menominee create mode 100644 usr/share/zoneinfo/America/Merida create mode 100644 usr/share/zoneinfo/America/Metlakatla create mode 100644 usr/share/zoneinfo/America/Mexico_City create mode 100644 usr/share/zoneinfo/America/Miquelon create mode 100644 usr/share/zoneinfo/America/Moncton create mode 100644 usr/share/zoneinfo/America/Monterrey create mode 100644 usr/share/zoneinfo/America/Montevideo rename usr/share/zoneinfo/{US/Eastern => America/New_York} (100%) create mode 100644 usr/share/zoneinfo/America/Nome create mode 100644 usr/share/zoneinfo/America/Noronha create mode 100644 usr/share/zoneinfo/America/North_Dakota/Beulah create mode 100644 usr/share/zoneinfo/America/North_Dakota/Center create mode 100644 usr/share/zoneinfo/America/North_Dakota/New_Salem create mode 100644 usr/share/zoneinfo/America/Nuuk create mode 100644 usr/share/zoneinfo/America/Ojinaga create mode 100644 usr/share/zoneinfo/America/Panama create mode 100644 usr/share/zoneinfo/America/Paramaribo rename usr/share/zoneinfo/{US/Arizona => America/Phoenix} (100%) create mode 100644 usr/share/zoneinfo/America/Port-au-Prince create mode 100644 usr/share/zoneinfo/America/Porto_Velho create mode 100644 usr/share/zoneinfo/America/Puerto_Rico create mode 100644 usr/share/zoneinfo/America/Punta_Arenas create mode 100644 usr/share/zoneinfo/America/Rankin_Inlet create mode 100644 usr/share/zoneinfo/America/Recife create mode 100644 usr/share/zoneinfo/America/Regina create mode 100644 usr/share/zoneinfo/America/Resolute create mode 100644 usr/share/zoneinfo/America/Rio_Branco create mode 100644 usr/share/zoneinfo/America/Santarem create mode 100644 usr/share/zoneinfo/America/Santiago create mode 100644 usr/share/zoneinfo/America/Santo_Domingo create mode 100644 usr/share/zoneinfo/America/Sao_Paulo create mode 100644 usr/share/zoneinfo/America/Scoresbysund create mode 100644 usr/share/zoneinfo/America/Sitka create mode 100644 usr/share/zoneinfo/America/St_Johns create mode 100644 usr/share/zoneinfo/America/Swift_Current create mode 100644 usr/share/zoneinfo/America/Tegucigalpa create mode 100644 usr/share/zoneinfo/America/Thule create mode 100644 usr/share/zoneinfo/America/Tijuana create mode 100644 usr/share/zoneinfo/America/Toronto create mode 100644 usr/share/zoneinfo/America/Vancouver create mode 100644 usr/share/zoneinfo/America/Whitehorse create mode 100644 usr/share/zoneinfo/America/Winnipeg create mode 100644 usr/share/zoneinfo/America/Yakutat delete mode 120000 usr/share/zoneinfo/Anchorage create mode 100644 usr/share/zoneinfo/Antarctica/Casey create mode 100644 usr/share/zoneinfo/Antarctica/Davis create mode 100644 usr/share/zoneinfo/Antarctica/Macquarie create mode 100644 usr/share/zoneinfo/Antarctica/Mawson create mode 100644 usr/share/zoneinfo/Antarctica/Palmer create mode 100644 usr/share/zoneinfo/Antarctica/Rothera create mode 100644 usr/share/zoneinfo/Antarctica/Troll create mode 100644 usr/share/zoneinfo/Antarctica/Vostok create mode 100644 usr/share/zoneinfo/Asia/Almaty create mode 100644 usr/share/zoneinfo/Asia/Amman create mode 100644 usr/share/zoneinfo/Asia/Anadyr create mode 100644 usr/share/zoneinfo/Asia/Aqtau create mode 100644 usr/share/zoneinfo/Asia/Aqtobe create mode 100644 usr/share/zoneinfo/Asia/Ashgabat create mode 100644 usr/share/zoneinfo/Asia/Atyrau create mode 100644 usr/share/zoneinfo/Asia/Baghdad create mode 100644 usr/share/zoneinfo/Asia/Baku create mode 100644 usr/share/zoneinfo/Asia/Bangkok create mode 100644 usr/share/zoneinfo/Asia/Barnaul create mode 100644 usr/share/zoneinfo/Asia/Beirut create mode 100644 usr/share/zoneinfo/Asia/Bishkek create mode 100644 usr/share/zoneinfo/Asia/Chita create mode 100644 usr/share/zoneinfo/Asia/Choibalsan create mode 100644 usr/share/zoneinfo/Asia/Colombo create mode 100644 usr/share/zoneinfo/Asia/Damascus create mode 100644 usr/share/zoneinfo/Asia/Dhaka create mode 100644 usr/share/zoneinfo/Asia/Dili create mode 100644 usr/share/zoneinfo/Asia/Dubai create mode 100644 usr/share/zoneinfo/Asia/Dushanbe create mode 100644 usr/share/zoneinfo/Asia/Famagusta create mode 100644 usr/share/zoneinfo/Asia/Gaza create mode 100644 usr/share/zoneinfo/Asia/Hebron create mode 100644 usr/share/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 usr/share/zoneinfo/Asia/Hong_Kong create mode 100644 usr/share/zoneinfo/Asia/Hovd create mode 100644 usr/share/zoneinfo/Asia/Irkutsk create mode 100644 usr/share/zoneinfo/Asia/Jakarta create mode 100644 usr/share/zoneinfo/Asia/Jayapura rename usr/share/zoneinfo/{Israel => Asia/Jerusalem} (100%) create mode 100644 usr/share/zoneinfo/Asia/Kabul create mode 100644 usr/share/zoneinfo/Asia/Kamchatka create mode 100644 usr/share/zoneinfo/Asia/Karachi create mode 100644 usr/share/zoneinfo/Asia/Kathmandu create mode 100644 usr/share/zoneinfo/Asia/Khandyga create mode 100644 usr/share/zoneinfo/Asia/Kolkata create mode 100644 usr/share/zoneinfo/Asia/Krasnoyarsk create mode 100644 usr/share/zoneinfo/Asia/Kuching create mode 100644 usr/share/zoneinfo/Asia/Macau create mode 100644 usr/share/zoneinfo/Asia/Magadan create mode 100644 usr/share/zoneinfo/Asia/Makassar create mode 100644 usr/share/zoneinfo/Asia/Manila create mode 100644 usr/share/zoneinfo/Asia/Nicosia create mode 100644 usr/share/zoneinfo/Asia/Novokuznetsk create mode 100644 usr/share/zoneinfo/Asia/Novosibirsk create mode 100644 usr/share/zoneinfo/Asia/Omsk create mode 100644 usr/share/zoneinfo/Asia/Oral create mode 100644 usr/share/zoneinfo/Asia/Pontianak create mode 100644 usr/share/zoneinfo/Asia/Pyongyang create mode 100644 usr/share/zoneinfo/Asia/Qatar create mode 100644 usr/share/zoneinfo/Asia/Qostanay create mode 100644 usr/share/zoneinfo/Asia/Qyzylorda create mode 100644 usr/share/zoneinfo/Asia/Riyadh create mode 100644 usr/share/zoneinfo/Asia/Sakhalin create mode 100644 usr/share/zoneinfo/Asia/Samarkand create mode 100644 usr/share/zoneinfo/Asia/Seoul create mode 100644 usr/share/zoneinfo/Asia/Shanghai rename usr/share/zoneinfo/{ => Asia}/Singapore (100%) create mode 100644 usr/share/zoneinfo/Asia/Srednekolymsk create mode 100644 usr/share/zoneinfo/Asia/Taipei create mode 100644 usr/share/zoneinfo/Asia/Tashkent create mode 100644 usr/share/zoneinfo/Asia/Tbilisi create mode 100644 usr/share/zoneinfo/Asia/Tehran create mode 100644 usr/share/zoneinfo/Asia/Thimphu create mode 100644 usr/share/zoneinfo/Asia/Tokyo create mode 100644 usr/share/zoneinfo/Asia/Tomsk create mode 100644 usr/share/zoneinfo/Asia/Ulaanbaatar create mode 100644 usr/share/zoneinfo/Asia/Urumqi create mode 100644 usr/share/zoneinfo/Asia/Ust-Nera create mode 100644 usr/share/zoneinfo/Asia/Vladivostok create mode 100644 usr/share/zoneinfo/Asia/Yakutsk create mode 100644 usr/share/zoneinfo/Asia/Yangon create mode 100644 usr/share/zoneinfo/Asia/Yekaterinburg create mode 100644 usr/share/zoneinfo/Asia/Yerevan create mode 100644 usr/share/zoneinfo/Atlantic/Azores create mode 100644 usr/share/zoneinfo/Atlantic/Bermuda create mode 100644 usr/share/zoneinfo/Atlantic/Canary create mode 100644 usr/share/zoneinfo/Atlantic/Cape_Verde create mode 100644 usr/share/zoneinfo/Atlantic/Faroe create mode 100644 usr/share/zoneinfo/Atlantic/Madeira create mode 100644 usr/share/zoneinfo/Atlantic/South_Georgia create mode 100644 usr/share/zoneinfo/Atlantic/Stanley create mode 100644 usr/share/zoneinfo/Australia/Adelaide create mode 100644 usr/share/zoneinfo/Australia/Brisbane create mode 100644 usr/share/zoneinfo/Australia/Broken_Hill create mode 100644 usr/share/zoneinfo/Australia/Darwin create mode 100644 usr/share/zoneinfo/Australia/Eucla create mode 100644 usr/share/zoneinfo/Australia/Hobart create mode 100644 usr/share/zoneinfo/Australia/Lindeman create mode 100644 usr/share/zoneinfo/Australia/Lord_Howe create mode 100644 usr/share/zoneinfo/Australia/Melbourne create mode 100644 usr/share/zoneinfo/Australia/Perth create mode 100644 usr/share/zoneinfo/Australia/Sydney delete mode 100644 usr/share/zoneinfo/Beijing delete mode 100644 usr/share/zoneinfo/Berlin delete mode 120000 usr/share/zoneinfo/Boulder create mode 100644 usr/share/zoneinfo/CET create mode 100644 usr/share/zoneinfo/CST6CDT delete mode 120000 usr/share/zoneinfo/Chicago create mode 100644 usr/share/zoneinfo/EET create mode 100644 usr/share/zoneinfo/EST create mode 100644 usr/share/zoneinfo/EST5EDT rename usr/share/zoneinfo/{UTC => Etc/GMT} (100%) create mode 100644 usr/share/zoneinfo/Etc/GMT+1 create mode 100644 usr/share/zoneinfo/Etc/GMT+10 create mode 100644 usr/share/zoneinfo/Etc/GMT+11 create mode 100644 usr/share/zoneinfo/Etc/GMT+12 create mode 100644 usr/share/zoneinfo/Etc/GMT+2 create mode 100644 usr/share/zoneinfo/Etc/GMT+3 create mode 100644 usr/share/zoneinfo/Etc/GMT+4 create mode 100644 usr/share/zoneinfo/Etc/GMT+5 create mode 100644 usr/share/zoneinfo/Etc/GMT+6 create mode 100644 usr/share/zoneinfo/Etc/GMT+7 create mode 100644 usr/share/zoneinfo/Etc/GMT+8 create mode 100644 usr/share/zoneinfo/Etc/GMT+9 create mode 100644 usr/share/zoneinfo/Etc/GMT-1 create mode 100644 usr/share/zoneinfo/Etc/GMT-10 create mode 100644 usr/share/zoneinfo/Etc/GMT-11 create mode 100644 usr/share/zoneinfo/Etc/GMT-12 create mode 100644 usr/share/zoneinfo/Etc/GMT-13 create mode 100644 usr/share/zoneinfo/Etc/GMT-14 create mode 100644 usr/share/zoneinfo/Etc/GMT-2 create mode 100644 usr/share/zoneinfo/Etc/GMT-3 create mode 100644 usr/share/zoneinfo/Etc/GMT-4 create mode 100644 usr/share/zoneinfo/Etc/GMT-5 create mode 100644 usr/share/zoneinfo/Etc/GMT-6 create mode 100644 usr/share/zoneinfo/Etc/GMT-7 create mode 100644 usr/share/zoneinfo/Etc/GMT-8 create mode 100644 usr/share/zoneinfo/Etc/GMT-9 create mode 100644 usr/share/zoneinfo/Etc/UTC create mode 100644 usr/share/zoneinfo/Europe/Andorra create mode 100644 usr/share/zoneinfo/Europe/Astrakhan create mode 100644 usr/share/zoneinfo/Europe/Athens create mode 100644 usr/share/zoneinfo/Europe/Belgrade create mode 100644 usr/share/zoneinfo/Europe/Berlin create mode 100644 usr/share/zoneinfo/Europe/Brussels create mode 100644 usr/share/zoneinfo/Europe/Bucharest create mode 100644 usr/share/zoneinfo/Europe/Budapest create mode 100644 usr/share/zoneinfo/Europe/Chisinau create mode 100644 usr/share/zoneinfo/Europe/Dublin create mode 100644 usr/share/zoneinfo/Europe/Gibraltar create mode 100644 usr/share/zoneinfo/Europe/Helsinki create mode 100644 usr/share/zoneinfo/Europe/Istanbul create mode 100644 usr/share/zoneinfo/Europe/Kaliningrad create mode 100644 usr/share/zoneinfo/Europe/Kirov create mode 100644 usr/share/zoneinfo/Europe/Kyiv create mode 100644 usr/share/zoneinfo/Europe/Lisbon create mode 100644 usr/share/zoneinfo/Europe/London create mode 100644 usr/share/zoneinfo/Europe/Madrid create mode 100644 usr/share/zoneinfo/Europe/Malta create mode 100644 usr/share/zoneinfo/Europe/Minsk create mode 100644 usr/share/zoneinfo/Europe/Moscow create mode 100644 usr/share/zoneinfo/Europe/Paris create mode 100644 usr/share/zoneinfo/Europe/Prague create mode 100644 usr/share/zoneinfo/Europe/Riga create mode 100644 usr/share/zoneinfo/Europe/Rome create mode 100644 usr/share/zoneinfo/Europe/Samara create mode 100644 usr/share/zoneinfo/Europe/Saratov create mode 100644 usr/share/zoneinfo/Europe/Simferopol create mode 100644 usr/share/zoneinfo/Europe/Sofia create mode 100644 usr/share/zoneinfo/Europe/Tallinn create mode 100644 usr/share/zoneinfo/Europe/Tirane create mode 100644 usr/share/zoneinfo/Europe/Ulyanovsk create mode 100644 usr/share/zoneinfo/Europe/Vienna create mode 100644 usr/share/zoneinfo/Europe/Vilnius create mode 100644 usr/share/zoneinfo/Europe/Volgograd create mode 100644 usr/share/zoneinfo/Europe/Warsaw create mode 100644 usr/share/zoneinfo/Europe/Zurich mode change 120000 => 100644 usr/share/zoneinfo/GMT delete mode 120000 usr/share/zoneinfo/GST create mode 100644 usr/share/zoneinfo/HST delete mode 120000 usr/share/zoneinfo/Honolulu delete mode 100644 usr/share/zoneinfo/India create mode 100644 usr/share/zoneinfo/Indian/Chagos create mode 100644 usr/share/zoneinfo/Indian/Maldives create mode 100644 usr/share/zoneinfo/Indian/Mauritius delete mode 100644 usr/share/zoneinfo/Japan delete mode 100644 usr/share/zoneinfo/London create mode 100644 usr/share/zoneinfo/MET create mode 100644 usr/share/zoneinfo/MST create mode 100644 usr/share/zoneinfo/MST7MDT delete mode 100644 usr/share/zoneinfo/Melbourne delete mode 120000 usr/share/zoneinfo/New_York create mode 100644 usr/share/zoneinfo/PST8PDT create mode 100644 usr/share/zoneinfo/Pacific/Apia create mode 100644 usr/share/zoneinfo/Pacific/Auckland create mode 100644 usr/share/zoneinfo/Pacific/Bougainville create mode 100644 usr/share/zoneinfo/Pacific/Chatham create mode 100644 usr/share/zoneinfo/Pacific/Easter create mode 100644 usr/share/zoneinfo/Pacific/Efate create mode 100644 usr/share/zoneinfo/Pacific/Fakaofo create mode 100644 usr/share/zoneinfo/Pacific/Fiji create mode 100644 usr/share/zoneinfo/Pacific/Galapagos create mode 100644 usr/share/zoneinfo/Pacific/Gambier create mode 100644 usr/share/zoneinfo/Pacific/Guadalcanal create mode 100644 usr/share/zoneinfo/Pacific/Guam rename usr/share/zoneinfo/{US/Hawaii => Pacific/Honolulu} (100%) create mode 100644 usr/share/zoneinfo/Pacific/Kanton create mode 100644 usr/share/zoneinfo/Pacific/Kiritimati create mode 100644 usr/share/zoneinfo/Pacific/Kosrae create mode 100644 usr/share/zoneinfo/Pacific/Kwajalein create mode 100644 usr/share/zoneinfo/Pacific/Marquesas create mode 100644 usr/share/zoneinfo/Pacific/Nauru create mode 100644 usr/share/zoneinfo/Pacific/Niue create mode 100644 usr/share/zoneinfo/Pacific/Norfolk create mode 100644 usr/share/zoneinfo/Pacific/Noumea rename usr/share/zoneinfo/{US/Samoa => Pacific/Pago_Pago} (100%) create mode 100644 usr/share/zoneinfo/Pacific/Palau create mode 100644 usr/share/zoneinfo/Pacific/Pitcairn create mode 100644 usr/share/zoneinfo/Pacific/Port_Moresby create mode 100644 usr/share/zoneinfo/Pacific/Rarotonga create mode 100644 usr/share/zoneinfo/Pacific/Tahiti create mode 100644 usr/share/zoneinfo/Pacific/Tarawa create mode 100644 usr/share/zoneinfo/Pacific/Tongatapu delete mode 100644 usr/share/zoneinfo/Sydney create mode 100644 usr/share/zoneinfo/WET diff --git a/Makefile b/Makefile index 4f5e61299..05299709e 100644 --- a/Makefile +++ b/Makefile @@ -258,7 +258,7 @@ include libc/thread/BUILD.mk # │ You can finally call malloc() include third_party/zlib/BUILD.mk # │ include libc/stdio/BUILD.mk # │ include tool/hello/BUILD.mk # │ -include libc/time/BUILD.mk # │ +include third_party/tz/BUILD.mk # │ include net/BUILD.mk # │ include third_party/vqsort/BUILD.mk # │ include libc/log/BUILD.mk # │ @@ -440,7 +440,7 @@ COSMOPOLITAN_OBJECTS = \ LIBC_X \ THIRD_PARTY_GETOPT \ LIBC_LOG \ - LIBC_TIME \ + THIRD_PARTY_TZ \ THIRD_PARTY_OPENMP \ THIRD_PARTY_MUSL \ THIRD_PARTY_ZLIB_GZ \ @@ -505,7 +505,6 @@ COSMOPOLITAN_H_PKGS = \ LIBC_STR \ LIBC_SYSV \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ LIBC_VGA \ diff --git a/dsp/mpeg/BUILD.mk b/dsp/mpeg/BUILD.mk index 147bffc47..a16089eaa 100644 --- a/dsp/mpeg/BUILD.mk +++ b/dsp/mpeg/BUILD.mk @@ -35,7 +35,6 @@ DSP_MPEG_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_TINYMATH \ THIRD_PARTY_COMPILER_RT diff --git a/dsp/mpeg/mpeg1.c b/dsp/mpeg/mpeg1.c index 905af23da..5b9eb0b82 100644 --- a/dsp/mpeg/mpeg1.c +++ b/dsp/mpeg/mpeg1.c @@ -39,7 +39,7 @@ #include "libc/math.h" #include "libc/mem/mem.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" __static_yoink("pl_mpeg_notice"); diff --git a/dsp/scale/BUILD.mk b/dsp/scale/BUILD.mk index 79c25a534..bd4f6df7e 100644 --- a/dsp/scale/BUILD.mk +++ b/dsp/scale/BUILD.mk @@ -31,7 +31,6 @@ DSP_SCALE_A_DIRECTDEPS = \ LIBC_NEXGEN32E \ LIBC_RUNTIME \ LIBC_STR \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X diff --git a/dsp/tty/BUILD.mk b/dsp/tty/BUILD.mk index c87dcb028..692ec26f5 100644 --- a/dsp/tty/BUILD.mk +++ b/dsp/tty/BUILD.mk @@ -38,7 +38,6 @@ DSP_TTY_A_DIRECTDEPS = \ LIBC_SOCK \ LIBC_SYSV \ LIBC_TINYMATH \ - LIBC_TIME \ LIBC_X DSP_TTY_A_DEPS := \ diff --git a/examples/BUILD.mk b/examples/BUILD.mk index 46faa0d95..a6965d922 100644 --- a/examples/BUILD.mk +++ b/examples/BUILD.mk @@ -65,7 +65,6 @@ EXAMPLES_DIRECTDEPS = \ LIBC_SYSV_CALLS \ LIBC_TESTLIB \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_VGA \ LIBC_X \ @@ -89,6 +88,7 @@ EXAMPLES_DIRECTDEPS = \ THIRD_PARTY_SED \ THIRD_PARTY_STB \ THIRD_PARTY_TR \ + THIRD_PARTY_TZ \ THIRD_PARTY_VQSORT \ THIRD_PARTY_XED \ THIRD_PARTY_ZLIB \ diff --git a/examples/date.c b/examples/date.c index 70b1f60d4..fbee50f5d 100644 --- a/examples/date.c +++ b/examples/date.c @@ -9,19 +9,30 @@ #endif #include "libc/calls/calls.h" #include "libc/calls/struct/timespec.h" +#include "libc/intrin/kprintf.h" +#include "libc/macros.internal.h" +#include "libc/nt/enum/timezoneid.h" +#include "libc/nt/struct/timezoneinformation.h" +#include "libc/nt/time.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" #include "libc/str/str.h" -#include "libc/time/struct/tm.h" +#include "libc/thread/threads.h" +#include "libc/time.h" /** * @fileoverview High performance ISO-8601 timestamp formatter. + * + * The strftime() function is very slow. This goes much faster. + * Consider using something like this instead for your loggers. */ char *GetTimestamp(void) { int x; struct timespec ts; - _Thread_local static long last; - _Thread_local static char s[27]; - _Thread_local static struct tm tm; + thread_local static long last; + thread_local static char s[32]; + thread_local static struct tm tm; clock_gettime(0, &ts); if (ts.tv_sec != last) { localtime_r(&ts.tv_sec, &tm); @@ -61,11 +72,21 @@ char *GetTimestamp(void) { s[23] = '0' + x / 100000 % 10; s[24] = '0' + x / 10000 % 10; s[25] = '0' + x / 1000 % 10; + s[26] = tm.tm_gmtoff < 0 ? '-' : '+'; + x = ABS(tm.tm_gmtoff) / 60 / 60; + s[27] = '0' + x / 10 % 10; + s[28] = '0' + x % 10; + x = ABS(tm.tm_gmtoff) / 60 % 60; + s[29] = '0' + x / 10 % 10; + s[30] = '0' + x % 10; return s; } int main(int argc, char *argv[]) { char buf[128], *p = buf; + // setenv("TZ", "UTC", true); + // setenv("TZ", "US/Eastern", true); + // setenv("TZ", "Asia/Kolkata", true); p = stpcpy(p, GetTimestamp()); p = stpcpy(p, "\n"); write(1, buf, p - buf); diff --git a/examples/hangman.c b/examples/hangman.c index 0aa257ad9..4aa736490 100644 --- a/examples/hangman.c +++ b/examples/hangman.c @@ -42,7 +42,7 @@ #include "libc/stdio/rand.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/zlib/zlib.h" // clang-format off diff --git a/examples/kilo.c b/examples/kilo.c index dfc5aeb46..055b29853 100644 --- a/examples/kilo.c +++ b/examples/kilo.c @@ -71,7 +71,7 @@ Contact: antirez@gmail.com"); #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/termios.h" -#include "libc/time/time.h" +#include "libc/time.h" /* Syntax highlight types */ #define HL_NORMAL 0 diff --git a/examples/localtime.c b/examples/localtime.c new file mode 100644 index 000000000..70d67c1c2 --- /dev/null +++ b/examples/localtime.c @@ -0,0 +1,15 @@ +#if 0 +/*─────────────────────────────────────────────────────────────────╗ +│ To the extent possible under law, Justine Tunney has waived │ +│ all copyright and related or neighboring rights to this file, │ +│ as it is written in the following disclaimers: │ +│ • http://unlicense.org/ │ +│ • http://creativecommons.org/publicdomain/zero/1.0/ │ +╚─────────────────────────────────────────────────────────────────*/ +#endif +#include "libc/time.h" + +int main(int argc, char *argv[]) { + int64_t t = 0; + localtime(&t); +} diff --git a/examples/nesemu1.cc b/examples/nesemu1.cc index 296980186..521fad822 100644 --- a/examples/nesemu1.cc +++ b/examples/nesemu1.cc @@ -44,7 +44,7 @@ #include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/w.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/xasprintf.h" #include "libc/x/xsigaction.h" #include "libc/zip.internal.h" diff --git a/examples/script.c b/examples/script.c index e840aca8a..e6559e626 100644 --- a/examples/script.c +++ b/examples/script.c @@ -50,7 +50,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/termios.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" // clang-format off diff --git a/examples/setitimer.c b/examples/setitimer.c index 1fedf863a..89b291941 100644 --- a/examples/setitimer.c +++ b/examples/setitimer.c @@ -17,7 +17,7 @@ #include "libc/sysv/consts/itimer.h" #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sig.h" -#include "libc/time/time.h" +#include "libc/time.h" volatile bool gotalrm; diff --git a/examples/stat.c b/examples/stat.c index f04025d98..dce122cbb 100644 --- a/examples/stat.c +++ b/examples/stat.c @@ -8,16 +8,18 @@ ╚─────────────────────────────────────────────────────────────────*/ #endif #include "libc/calls/struct/stat.h" +#include "libc/assert.h" #include "libc/calls/calls.h" #include "libc/errno.h" #include "libc/fmt/conv.h" #include "libc/log/check.h" #include "libc/log/log.h" #include "libc/mem/gc.h" +#include "libc/mem/mem.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/s.h" -#include "libc/x/xiso8601.h" +#include "libc/time.h" /** * @fileoverview File metadata viewer. @@ -27,6 +29,23 @@ bool numeric; +char *xiso8601(struct timespec ts) { + struct tm tm; + if (!localtime_r(&ts.tv_sec, &tm)) + return 0; + int len = 128; + char *res = malloc(len); + char *ptr = res; + char *end = res + len; + if (!res) + return 0; + ptr += strftime(ptr, end - ptr, "%Y-%m-%d %H:%M:%S", &tm); + ptr += snprintf(ptr, end - ptr, ".%09ld", ts.tv_nsec); + ptr += strftime(ptr, end - ptr, "%z %Z", &tm); + unassert(ptr + 1 <= end); + return res; +} + const char *DescribeFileType(unsigned mode) { switch (mode & S_IFMT) { case S_IFIFO: @@ -74,16 +93,16 @@ void PrintFileMetadata(const char *pathname, struct stat *st) { "%-32s%s\n" "%-32s%s\n" "%-32s%s\n", - "bytes in file", st->st_size, "physical bytes", st->st_blocks * 512, - "device id w/ file", st->st_dev, "inode", st->st_ino, - "hard link count", st->st_nlink, "mode / permissions", st->st_mode, - DescribeFileType(st->st_mode), "owner id", st->st_uid, "group id", - st->st_gid, "flags", st->st_flags, "gen", st->st_gen, - "device id (if special)", st->st_rdev, "block size", st->st_blksize, - "access time", gc(xiso8601(&st->st_atim)), "modified time", - gc(xiso8601(&st->st_mtim)), "c[omplicated]time", - gc(xiso8601(&st->st_ctim)), "birthtime", - gc(xiso8601(&st->st_birthtim))); + "bytes in file:", st->st_size, "physical bytes:", st->st_blocks * 512, + "device id w/ file:", st->st_dev, "inode:", st->st_ino, + "hard link count:", st->st_nlink, "mode / permissions:", st->st_mode, + DescribeFileType(st->st_mode), "owner id:", st->st_uid, + "group id:", st->st_gid, "flags:", st->st_flags, "gen:", st->st_gen, + "device id (if special):", st->st_rdev, "block size:", st->st_blksize, + "access time:", gc(xiso8601(st->st_atim)), + "modified time:", gc(xiso8601(st->st_mtim)), + "c[omplicated]time:", gc(xiso8601(st->st_ctim)), + "[birthtime]:", gc(xiso8601(st->st_birthtim))); } int main(int argc, char *argv[]) { diff --git a/examples/wall.c b/examples/wall.c index e0fece754..311a9e3bc 100644 --- a/examples/wall.c +++ b/examples/wall.c @@ -16,7 +16,7 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/o.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/passwd.h" diff --git a/libc/BUILD.mk b/libc/BUILD.mk index 523020830..7ebd0fd4a 100644 --- a/libc/BUILD.mk +++ b/libc/BUILD.mk @@ -300,7 +300,6 @@ o/$(MODE)/libc: o/$(MODE)/libc/calls \ o/$(MODE)/libc/sysv \ o/$(MODE)/libc/testlib \ o/$(MODE)/libc/thread \ - o/$(MODE)/libc/time \ o/$(MODE)/libc/tinymath \ o/$(MODE)/libc/vga \ o/$(MODE)/libc/x \ diff --git a/libc/calls/clock_getres.c b/libc/calls/clock_getres.c index 3f4be4717..845875461 100644 --- a/libc/calls/clock_getres.c +++ b/libc/calls/clock_getres.c @@ -23,7 +23,7 @@ #include "libc/intrin/strace.internal.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" static int sys_clock_getres_poly(int clock, struct timespec *ts, int64_t real, int64_t real_coarse, int64_t boot) { diff --git a/libc/time/futimesat.c b/libc/calls/futimesat.c similarity index 100% rename from libc/time/futimesat.c rename to libc/calls/futimesat.c diff --git a/libc/calls/gettimeofday.c b/libc/calls/gettimeofday.c index 34fc8547c..78c170e78 100644 --- a/libc/calls/gettimeofday.c +++ b/libc/calls/gettimeofday.c @@ -19,7 +19,7 @@ #include "libc/calls/struct/timespec.h" #include "libc/calls/struct/timeval.h" #include "libc/sysv/consts/clock.h" -#include "libc/time/struct/timezone.h" +#include "libc/time.h" /** * Returns system wall time in microseconds, e.g. diff --git a/libc/calls/settimeofday.c b/libc/calls/settimeofday.c index 4766790f6..116c1b38e 100644 --- a/libc/calls/settimeofday.c +++ b/libc/calls/settimeofday.c @@ -22,7 +22,7 @@ #include "libc/dce.h" #include "libc/intrin/strace.internal.h" #include "libc/sysv/errfuns.h" -#include "libc/time/struct/timezone.h" +#include "libc/time.h" /** * Changes time. diff --git a/libc/calls/sleep.c b/libc/calls/sleep.c index 90debc667..382aa4587 100644 --- a/libc/calls/sleep.c +++ b/libc/calls/sleep.c @@ -24,7 +24,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/thread/posixthread.internal.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Sleeps for particular number of seconds. diff --git a/libc/calls/stime.c b/libc/calls/stime.c index d97d12c4f..820558f56 100644 --- a/libc/calls/stime.c +++ b/libc/calls/stime.c @@ -17,7 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/timeval.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Changes time, the old fashioned way. diff --git a/libc/calls/struct/timeval.h b/libc/calls/struct/timeval.h index e2004b7e6..553e985fb 100644 --- a/libc/calls/struct/timeval.h +++ b/libc/calls/struct/timeval.h @@ -1,7 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_CALLS_STRUCT_TIMEVAL_H_ #define COSMOPOLITAN_LIBC_CALLS_STRUCT_TIMEVAL_H_ #include "libc/calls/struct/timespec.h" -#include "libc/time/struct/timezone.h" +#include "libc/time.h" COSMOPOLITAN_C_START_ struct timeval { diff --git a/libc/calls/struct/timeval.internal.h b/libc/calls/struct/timeval.internal.h index d3eca91bc..ceaf8f73e 100644 --- a/libc/calls/struct/timeval.internal.h +++ b/libc/calls/struct/timeval.internal.h @@ -2,7 +2,7 @@ #define COSMOPOLITAN_LIBC_CALLS_STRUCT_TIMEVAL_INTERNAL_H_ #include "libc/calls/struct/timeval.h" #include "libc/mem/alloca.h" -#include "libc/time/struct/timezone.h" +#include "libc/time.h" COSMOPOLITAN_C_START_ int sys_settimeofday(const struct timeval *, const struct timezone *); diff --git a/libc/calls/time.c b/libc/calls/time.c index aa90da67a..644fa669e 100644 --- a/libc/calls/time.c +++ b/libc/calls/time.c @@ -16,7 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/calls/struct/timeval.h" #include "libc/dce.h" #include "libc/intrin/asan.internal.h" diff --git a/libc/calls/timespec_get.c b/libc/calls/timespec_get.c index fae6ca813..4dd0eadbd 100644 --- a/libc/calls/timespec_get.c +++ b/libc/calls/timespec_get.c @@ -18,7 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/timespec.h" #include "libc/sysv/consts/clock.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Returns high-precision timestamp, the C11 way. diff --git a/libc/calls/timespec_getres.c b/libc/calls/timespec_getres.c index 56ceb2514..b695823ea 100644 --- a/libc/calls/timespec_getres.c +++ b/libc/calls/timespec_getres.c @@ -18,7 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/timespec.h" #include "libc/sysv/consts/clock.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Returns high-precision timestamp granularity, the C23 way. diff --git a/libc/calls/usleep.c b/libc/calls/usleep.c index 6fafae9e8..82dd7b55f 100644 --- a/libc/calls/usleep.c +++ b/libc/calls/usleep.c @@ -21,7 +21,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/utime.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Sleeps for particular number of microseconds. diff --git a/libc/calls/utime.c b/libc/calls/utime.c index 9e5ad3f8b..a799a9ad6 100644 --- a/libc/calls/utime.c +++ b/libc/calls/utime.c @@ -16,8 +16,8 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/utime.h" #include "libc/calls/struct/timeval.h" -#include "libc/time/struct/utimbuf.h" /** * Changes last accessed/modified times on file. diff --git a/libc/calls/utimensat-nt.c b/libc/calls/utimensat-nt.c index ce843388c..0a0c0a082 100644 --- a/libc/calls/utimensat-nt.c +++ b/libc/calls/utimensat-nt.c @@ -33,7 +33,7 @@ #include "libc/sysv/consts/at.h" #include "libc/sysv/consts/utime.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" static textwindows int sys_utimensat_nt_impl(int dirfd, const char *path, const struct timespec ts[2], diff --git a/libc/calls/utimensat-sysv.c b/libc/calls/utimensat-sysv.c index d024d731f..0a4401da2 100644 --- a/libc/calls/utimensat-sysv.c +++ b/libc/calls/utimensat-sysv.c @@ -24,7 +24,7 @@ #include "libc/fmt/conv.h" #include "libc/runtime/zipos.internal.h" #include "libc/sysv/consts/at.h" -#include "libc/time/time.h" +#include "libc/time.h" int sys_utimensat(int dirfd, const char *path, const struct timespec ts[2], int flags) { diff --git a/libc/intrin/BUILD.mk b/libc/intrin/BUILD.mk index 2ba6fa39b..d912f8556 100644 --- a/libc/intrin/BUILD.mk +++ b/libc/intrin/BUILD.mk @@ -132,6 +132,14 @@ o/$(MODE)/libc/intrin/ktcpoptnames.o: libc/intrin/ktcpoptnames.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< o/$(MODE)/libc/intrin/stackcall.o: libc/intrin/stackcall.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< +o/$(MODE)/libc/intrin/kmonthname.o: libc/intrin/kmonthname.S + @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< +o/$(MODE)/libc/intrin/kmonthnameshort.o: libc/intrin/kmonthnameshort.S + @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< +o/$(MODE)/libc/intrin/kweekdayname.o: libc/intrin/kweekdayname.S + @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< +o/$(MODE)/libc/intrin/kweekdaynameshort.o: libc/intrin/kweekdaynameshort.S + @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< LIBC_INTRIN_LIBS = $(foreach x,$(LIBC_INTRIN_ARTIFACTS),$($(x))) LIBC_INTRIN_HDRS = $(foreach x,$(LIBC_INTRIN_ARTIFACTS),$($(x)_HDRS)) diff --git a/libc/time/kmonthname.S b/libc/intrin/kmonthname.S similarity index 100% rename from libc/time/kmonthname.S rename to libc/intrin/kmonthname.S diff --git a/libc/time/kmonthnameshort.S b/libc/intrin/kmonthnameshort.S similarity index 100% rename from libc/time/kmonthnameshort.S rename to libc/intrin/kmonthnameshort.S diff --git a/libc/time/kweekdayname.S b/libc/intrin/kweekdayname.S similarity index 100% rename from libc/time/kweekdayname.S rename to libc/intrin/kweekdayname.S diff --git a/libc/time/kweekdaynameshort.S b/libc/intrin/kweekdaynameshort.S similarity index 100% rename from libc/time/kweekdaynameshort.S rename to libc/intrin/kweekdaynameshort.S diff --git a/libc/intrin/ubsan.c b/libc/intrin/ubsan.c index 35d9799e5..98c22d85d 100644 --- a/libc/intrin/ubsan.c +++ b/libc/intrin/ubsan.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/intrin/ubsan.h" #include "libc/calls/calls.h" #include "libc/intrin/kprintf.h" #include "libc/intrin/pushpop.internal.h" @@ -241,6 +242,8 @@ static void __ubsan_warning(const struct UbsanSourceLocation *loc, const char *description) { kprintf("%s:%d: %subsan warning: %s is undefined behavior%s\n", loc->file, loc->line, SUBTLE, description, RESET); + if (__ubsan_strict) + __ubsan_die()(); } __wur __ubsan_die_f *__ubsan_abort(const struct UbsanSourceLocation *loc, diff --git a/libc/intrin/ubsan.h b/libc/intrin/ubsan.h new file mode 100644 index 000000000..c258ed74f --- /dev/null +++ b/libc/intrin/ubsan.h @@ -0,0 +1,8 @@ +#ifndef COSMOPOLITAN_LIBC_INTRIN_UBSAN_H_ +#define COSMOPOLITAN_LIBC_INTRIN_UBSAN_H_ +COSMOPOLITAN_C_START_ + +extern bool32 __ubsan_strict; + +COSMOPOLITAN_C_END_ +#endif /* COSMOPOLITAN_LIBC_INTRIN_UBSAN_H_ */ diff --git a/libc/time/timezone.c b/libc/intrin/ubsanconf.c similarity index 91% rename from libc/time/timezone.c rename to libc/intrin/ubsanconf.c index 9d5696b45..ca3180857 100644 --- a/libc/time/timezone.c +++ b/libc/intrin/ubsanconf.c @@ -1,7 +1,7 @@ /*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ Copyright 2024 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,8 +16,8 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/time/time.h" -char *tzname[2]; -long timezone; -int daylight; +/** + * If set to true, UBSAN warnings will become fatal. + */ +bool32 __ubsan_strict = false; diff --git a/libc/isystem/sys/stat.h b/libc/isystem/sys/stat.h index 07b3951c9..960297ffb 100644 --- a/libc/isystem/sys/stat.h +++ b/libc/isystem/sys/stat.h @@ -7,5 +7,5 @@ #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" +#include "libc/time.h" #endif diff --git a/libc/isystem/sys/time.h b/libc/isystem/sys/time.h index 3ad0ae0d3..7bfc08041 100644 --- a/libc/isystem/sys/time.h +++ b/libc/isystem/sys/time.h @@ -6,6 +6,5 @@ #include "libc/sock/select.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/itimer.h" -#include "libc/time/struct/timezone.h" -#include "libc/time/time.h" +#include "libc/time.h" #endif diff --git a/libc/isystem/time.h b/libc/isystem/time.h index f9a7f137c..9aab2dc88 100644 --- a/libc/isystem/time.h +++ b/libc/isystem/time.h @@ -7,6 +7,5 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #endif /* _TIME_H */ diff --git a/libc/isystem/unistd.h b/libc/isystem/unistd.h index 78b62edb9..5266cba01 100644 --- a/libc/isystem/unistd.h +++ b/libc/isystem/unistd.h @@ -9,7 +9,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/unistd.h" #include "third_party/getopt/long1.h" #include "third_party/musl/crypt.h" diff --git a/libc/isystem/utime.h b/libc/isystem/utime.h index c3cf95e65..2df17e2f3 100644 --- a/libc/isystem/utime.h +++ b/libc/isystem/utime.h @@ -1,5 +1,4 @@ #ifndef _UTIME_H #define _UTIME_H -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" +#include "libc/utime.h" #endif /* _UTIME_H */ diff --git a/libc/isystem/wchar.h b/libc/isystem/wchar.h index ecf5ecada..cd9ecef37 100644 --- a/libc/isystem/wchar.h +++ b/libc/isystem/wchar.h @@ -5,5 +5,5 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/str/unicode.h" -#include "libc/time/time.h" +#include "libc/time.h" #endif /* _WCHAR_H */ diff --git a/libc/log/BUILD.mk b/libc/log/BUILD.mk index b563ce28d..f776ec2c4 100644 --- a/libc/log/BUILD.mk +++ b/libc/log/BUILD.mk @@ -39,11 +39,11 @@ LIBC_LOG_A_DIRECTDEPS = \ LIBC_SYSV \ LIBC_SYSV_CALLS \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_DLMALLOC \ - THIRD_PARTY_GDTOA + THIRD_PARTY_GDTOA \ + THIRD_PARTY_TZ LIBC_LOG_A_DEPS := \ $(call uniq,$(foreach x,$(LIBC_LOG_A_DIRECTDEPS),$($(x)))) diff --git a/libc/log/vflogf.c b/libc/log/vflogf.c index 9dedc9283..f90b118e3 100644 --- a/libc/log/vflogf.c +++ b/libc/log/vflogf.c @@ -37,8 +37,7 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/fileno.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #define kNontrivialSize (8 * 1000 * 1000) diff --git a/libc/nt/enum/timezoneid.h b/libc/nt/enum/timezoneid.h new file mode 100644 index 000000000..eeb2cc040 --- /dev/null +++ b/libc/nt/enum/timezoneid.h @@ -0,0 +1,8 @@ +#ifndef COSMOPOLITAN_LIBC_NT_ENUM_TIMEZONEID_H_ +#define COSMOPOLITAN_LIBC_NT_ENUM_TIMEZONEID_H_ + +#define kNtTimeZoneIdUnknown 0 +#define kNtTimeZoneIdStandard 1 +#define kNtTimeZoneIdDaylight 2 + +#endif /* COSMOPOLITAN_LIBC_NT_ENUM_TIMEZONEID_H_ */ diff --git a/libc/nt/kernel32/GetDynamicTimeZoneInformation.S b/libc/nt/kernel32/GetDynamicTimeZoneInformation.S new file mode 100644 index 000000000..4b99b4e96 --- /dev/null +++ b/libc/nt/kernel32/GetDynamicTimeZoneInformation.S @@ -0,0 +1,20 @@ +#include "libc/nt/codegen.h" +.imp kernel32,__imp_GetDynamicTimeZoneInformation,GetDynamicTimeZoneInformation + + .text.windows + .ftrace1 +GetDynamicTimeZoneInformation: + .ftrace2 +#ifdef __x86_64__ + push %rbp + mov %rsp,%rbp + mov %rdi,%rcx + sub $32,%rsp + call *__imp_GetDynamicTimeZoneInformation(%rip) + leave +#elif defined(__aarch64__) + mov x0,#0 +#endif + ret + .endfn GetDynamicTimeZoneInformation,globl + .previous diff --git a/libc/nt/kernel32/GetTimeZoneInformation.S b/libc/nt/kernel32/GetTimeZoneInformation.S new file mode 100644 index 000000000..fdec44922 --- /dev/null +++ b/libc/nt/kernel32/GetTimeZoneInformation.S @@ -0,0 +1,20 @@ +#include "libc/nt/codegen.h" +.imp kernel32,__imp_GetTimeZoneInformation,GetTimeZoneInformation + + .text.windows + .ftrace1 +GetTimeZoneInformation: + .ftrace2 +#ifdef __x86_64__ + push %rbp + mov %rsp,%rbp + mov %rdi,%rcx + sub $32,%rsp + call *__imp_GetTimeZoneInformation(%rip) + leave +#elif defined(__aarch64__) + mov x0,#0 +#endif + ret + .endfn GetTimeZoneInformation,globl + .previous diff --git a/libc/nt/master.sh b/libc/nt/master.sh index ace1dbf57..274e333cc 100755 --- a/libc/nt/master.sh +++ b/libc/nt/master.sh @@ -168,6 +168,8 @@ imp 'GetSystemTimePreciseAsFileTime' GetSystemTimePreciseAsFileTime kernel3 imp 'GetSystemTimes' GetSystemTimes kernel32 3 imp 'GetTempPath' GetTempPathW kernel32 2 imp 'GetTempPathA' GetTempPathA kernel32 2 +imp 'GetDynamicTimeZoneInformation' GetDynamicTimeZoneInformation kernel32 1 +imp 'GetTimeZoneInformation' GetTimeZoneInformation kernel32 1 imp 'GetThreadContext' GetThreadContext kernel32 2 imp 'GetThreadDescription' GetThreadDescription kernel32 2 imp 'GetThreadIOPendingFlag' GetThreadIOPendingFlag kernel32 2 diff --git a/libc/nt/struct/dynamictimezoneinformation.h b/libc/nt/struct/dynamictimezoneinformation.h new file mode 100644 index 000000000..ec29cef51 --- /dev/null +++ b/libc/nt/struct/dynamictimezoneinformation.h @@ -0,0 +1,17 @@ +#ifndef COSMOPOLITAN_LIBC_NT_STRUCT_DYNAMICTIMEZONEINFORMATION_H_ +#define COSMOPOLITAN_LIBC_NT_STRUCT_DYNAMICTIMEZONEINFORMATION_H_ +#include "libc/nt/struct/systemtime.h" + +struct NtDynamicTimeZoneInformation { + int32_t Bias; + char16_t StandardName[32]; + struct NtSystemTime StandardDate; + int32_t StandardBias; + char16_t DaylightName[32]; + struct NtSystemTime DaylightDate; + int32_t DaylightBias; + char16_t TimeZoneKeyName[128]; + bool32 DynamicDaylightTimeDisabled; +}; + +#endif /* COSMOPOLITAN_LIBC_NT_STRUCT_DYNAMICTIMEZONEINFORMATION_H_ */ diff --git a/libc/nt/struct/timezoneinformation.h b/libc/nt/struct/timezoneinformation.h new file mode 100644 index 000000000..ea471b9ac --- /dev/null +++ b/libc/nt/struct/timezoneinformation.h @@ -0,0 +1,15 @@ +#ifndef COSMOPOLITAN_LIBC_NT_STRUCT_TIMEZONEINFORMATION_H_ +#define COSMOPOLITAN_LIBC_NT_STRUCT_TIMEZONEINFORMATION_H_ +#include "libc/nt/struct/systemtime.h" + +struct NtTimeZoneInformation { + int Bias; /* in minutes e.g. +480 for -8:00 */ + char16_t StandardName[32]; /* e.g. "Pacific Standard Time" */ + struct NtSystemTime StandardDate; + int StandardBias; + char16_t DaylightName[32]; /* e.g. "Pacific Daylight Time" */ + struct NtSystemTime DaylightDate; + int DaylightBias; /* e.g. -60 */ +}; + +#endif /* COSMOPOLITAN_LIBC_NT_STRUCT_TIMEZONEINFORMATION_H_ */ diff --git a/libc/nt/time.h b/libc/nt/time.h new file mode 100644 index 000000000..59c359ca3 --- /dev/null +++ b/libc/nt/time.h @@ -0,0 +1,37 @@ +#ifndef COSMOPOLITAN_LIBC_NT_TIME_H_ +#define COSMOPOLITAN_LIBC_NT_TIME_H_ +#include "libc/nt/struct/dynamictimezoneinformation.h" +#include "libc/nt/struct/timezoneinformation.h" +COSMOPOLITAN_C_START_ +/* ░░░░ + ▒▒▒░░░▒▒▒▒▒▒▒▓▓▓░ + ▒▒▒▒░░░▒▒▒▒▒▒▓▓▓▓▓▓░ + ▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▒▓░ + ▒▒▒░░░░▒▒▒▒▒▒▓▓▓▓▓▓ ▓▓▓▓▓▓▒ ▒▒▒▓▓█ + ▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓ + ░▒▒▒░░░░▒▒▒▒▒▒▓▓▓▓▓▓ █▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█ + ▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓░ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓ + ▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▒ + ▒▒▒▒▓▓ ▓▒▒▓▓▓▓ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█ + ▒▓ ▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓ + ░░░░░░░░░░░▒▒▒▒ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█ + ▒▒░░░░░░░░░░▒▒▒▒▒▓▓▓ ▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓ + ░▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓░ ░▓███▓ + ▒▒░░░░░░░░░░▒▒▒▒▒▓▓░ ▒▓▓▓▒▒▒ ░▒▒▒▓ ████████████ + ▒▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▒▓▓▓▓▒▒▒▒▒▒▒▒░░░▒▒▒▒▒░ ░███ + ▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▓ ███ + ▒▒░░░░░░░░░░▒▒▒▒▒▒▓▓ ▒▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒ ▓██ + ▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓▓▓▓▒▒▒▒▒▒▒▒░░░▒▒▒▒▒▓ ▓██ + ▒▒░░░▒▒▒░░░▒▒░▒▒▒▓▓▒ ▒▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒ ███ + ░▒▓ ░▓▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▓ ▓██ +╔────────────────────────────────────────────────────────────────▀▀▀─────────│─╗ +│ cosmopolitan § new technology » time ─╬─│┼ +╚────────────────────────────────────────────────────────────────────────────│*/ + +uint32_t GetTimeZoneInformation( + struct NtTimeZoneInformation *out_lpTimeZoneInformation); +uint32_t GetDynamicTimeZoneInformation( + struct NtDynamicTimeZoneInformation *out_lpTimeZoneInformation); + +COSMOPOLITAN_C_END_ +#endif /* COSMOPOLITAN_LIBC_NT_TIME_H_ */ diff --git a/libc/proc/clock.c b/libc/proc/clock.c index 97e3f8f51..7db424aa3 100644 --- a/libc/proc/clock.c +++ b/libc/proc/clock.c @@ -22,7 +22,7 @@ #include "libc/calls/struct/timeval.h" #include "libc/errno.h" #include "libc/sysv/consts/rusage.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Returns sum of CPU time consumed by current process since birth. diff --git a/libc/proc/times.c b/libc/proc/times.c index 640586c2a..1538e1a9b 100644 --- a/libc/proc/times.c +++ b/libc/proc/times.c @@ -28,7 +28,7 @@ #include "libc/runtime/clktck.h" #include "libc/runtime/sysconf.h" #include "libc/sysv/consts/rusage.h" -#include "libc/time/time.h" +#include "libc/time.h" static dontinline long ConvertMicros(struct timeval tv) { return tv.tv_sec * CLK_TCK + tv.tv_usec / (1000000 / CLK_TCK); diff --git a/libc/runtime/hog.py b/libc/runtime/hog.py new file mode 100644 index 000000000..5da3dce2e --- /dev/null +++ b/libc/runtime/hog.py @@ -0,0 +1,2 @@ +for i, c in enumerate("Asia/Kolkata"): + print("buf[%d] = '%c';" % (i, c)) diff --git a/libc/sock/BUILD.mk b/libc/sock/BUILD.mk index f9fb5dca9..bd74fe141 100644 --- a/libc/sock/BUILD.mk +++ b/libc/sock/BUILD.mk @@ -42,7 +42,7 @@ LIBC_SOCK_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_SYSV_CALLS \ - LIBC_TIME + THIRD_PARTY_TZ LIBC_SOCK_A_DEPS := \ $(call uniq,$(foreach x,$(LIBC_SOCK_A_DIRECTDEPS),$($(x)))) diff --git a/libc/sock/syslog.c b/libc/sock/syslog.c index 771394cbb..c0ac9caf5 100644 --- a/libc/sock/syslog.c +++ b/libc/sock/syslog.c @@ -38,7 +38,7 @@ #include "libc/sysv/consts/log.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/sock.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" /* Note: log_facility should be initialized with LOG_USER by default, * but since LOG_USER is not a constant value, we cannot initialize it diff --git a/libc/stdio/BUILD.mk b/libc/stdio/BUILD.mk index 43e25aacf..069e5cf08 100644 --- a/libc/stdio/BUILD.mk +++ b/libc/stdio/BUILD.mk @@ -53,6 +53,12 @@ $(LIBC_STDIO_A).pkg: \ # offer assurances about the stack safety of cosmo libc $(LIBC_STDIO_A_OBJS): private COPTS += -Wframe-larger-than=4096 -Walloca-larger-than=4096 +$(LIBC_STDIO_A_OBJS): private \ + CFLAGS += \ + -fno-sanitize=all \ + -Wframe-larger-than=4096 \ + -Walloca-larger-than=4096 + o/$(MODE)/libc/stdio/fputc.o: private \ CFLAGS += \ -O3 diff --git a/libc/stdio/vfprintf_unlocked.c b/libc/stdio/vfprintf_unlocked.c index 9c8bf710b..a6ed81dbd 100644 --- a/libc/stdio/vfprintf_unlocked.c +++ b/libc/stdio/vfprintf_unlocked.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" #include "libc/calls/calls.h" #include "libc/fmt/internal.h" #include "libc/stdckdint.h" diff --git a/libc/str/BUILD.mk b/libc/str/BUILD.mk index 1600b2f3a..ab0193593 100644 --- a/libc/str/BUILD.mk +++ b/libc/str/BUILD.mk @@ -87,6 +87,13 @@ o/$(MODE)/libc/str/windowstimetotimespec.o: private \ CFLAGS += \ -O2 +# we need -O3 because: +# we're dividing by constants +o/$(MODE)/libc/str/iso8601.o \ +o/$(MODE)/libc/str/iso8601us.o: private \ + CFLAGS += \ + -O3 + $(LIBC_STR_A_OBJS): private \ CFLAGS += \ -fno-sanitize=all \ diff --git a/libc/str/dosdatetimetounix.c b/libc/str/dosdatetimetounix.c index 84e21ad22..7cc956fd3 100644 --- a/libc/str/dosdatetimetounix.c +++ b/libc/str/dosdatetimetounix.c @@ -18,7 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/fmt/conv.h" #include "libc/macros.internal.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Converts MS-DOS timestamp to UNIX. diff --git a/libc/time/iso8601.c b/libc/str/iso8601.c similarity index 98% rename from libc/time/iso8601.c rename to libc/str/iso8601.c index 28483b9fd..95c897789 100644 --- a/libc/time/iso8601.c +++ b/libc/str/iso8601.c @@ -17,8 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Converts timestamp to ISO-8601 formatted string. diff --git a/libc/time/iso8601us.c b/libc/str/iso8601us.c similarity index 98% rename from libc/time/iso8601us.c rename to libc/str/iso8601us.c index 4915423b1..0b0b5a53b 100644 --- a/libc/time/iso8601us.c +++ b/libc/str/iso8601us.c @@ -17,8 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Converts timestamp to ISO-8601 formatted string. diff --git a/libc/str/kmonthyearday.c b/libc/str/kmonthyearday.c index b3a6b5eef..e7987e8c7 100644 --- a/libc/str/kmonthyearday.c +++ b/libc/str/kmonthyearday.c @@ -16,7 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/time/time.h" +#include "libc/time.h" const unsigned short kMonthYearDay[2][12] = { {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, diff --git a/libc/str/locale.h b/libc/str/locale.h index ed3ee6ad8..37da90911 100644 --- a/libc/str/locale.h +++ b/libc/str/locale.h @@ -1,7 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_STR_LOCALE_H_ #define COSMOPOLITAN_LIBC_STR_LOCALE_H_ #include "libc/fmt/conv.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #define LC_CTYPE 0 #define LC_NUMERIC 1 @@ -21,7 +21,7 @@ COSMOPOLITAN_C_START_ -#define LC_GLOBAL_LOCALE ((locale_t)-1) +#define LC_GLOBAL_LOCALE ((locale_t) - 1) struct __locale_map { const void *map; diff --git a/libc/testlib/BUILD.mk b/libc/testlib/BUILD.mk index 0346e351f..6617d0fbd 100644 --- a/libc/testlib/BUILD.mk +++ b/libc/testlib/BUILD.mk @@ -104,13 +104,13 @@ LIBC_TESTLIB_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_SYSV_CALLS \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_DLMALLOC \ THIRD_PARTY_GDTOA \ - THIRD_PARTY_XED + THIRD_PARTY_XED \ + THIRD_PARTY_TZ LIBC_TESTLIB_A_DEPS := \ $(call uniq,$(foreach x,$(LIBC_TESTLIB_A_DIRECTDEPS),$($(x)))) diff --git a/libc/testlib/testmain.c b/libc/testlib/testmain.c index e4704bdae..c87f84ac5 100644 --- a/libc/testlib/testmain.c +++ b/libc/testlib/testmain.c @@ -29,6 +29,7 @@ #include "libc/intrin/getenv.internal.h" #include "libc/intrin/safemacros.internal.h" #include "libc/intrin/strace.internal.h" +#include "libc/intrin/ubsan.h" #include "libc/intrin/weaken.h" #include "libc/log/log.h" #include "libc/macros.internal.h" @@ -93,6 +94,7 @@ dontasan int main(int argc, char *argv[]) { struct Dll *e; struct TestAspect *a; + __ubsan_strict = true; __log_level = kLogInfo; GetOpts(argc, argv); diff --git a/libc/thread/setitimer.c b/libc/thread/setitimer.c index aa3f4f7f4..544f026cd 100644 --- a/libc/thread/setitimer.c +++ b/libc/thread/setitimer.c @@ -23,7 +23,7 @@ #include "libc/intrin/describeflags.internal.h" #include "libc/intrin/strace.internal.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * Schedules delivery of one-shot or intermittent interrupt signal, e.g. diff --git a/libc/time/struct/tm.h b/libc/time.h similarity index 60% rename from libc/time/struct/tm.h rename to libc/time.h index 04f65cbe9..d82645281 100644 --- a/libc/time/struct/tm.h +++ b/libc/time.h @@ -1,5 +1,8 @@ -#ifndef COSMOPOLITAN_LIBC_TIME_STRUCT_TM_H_ -#define COSMOPOLITAN_LIBC_TIME_STRUCT_TM_H_ +#ifndef COSMOPOLITAN_LIBC_TIME_H_ +#define COSMOPOLITAN_LIBC_TIME_H_ + +#define TIME_UTC 1 + COSMOPOLITAN_C_START_ struct tm { @@ -16,8 +19,18 @@ struct tm { const char *tm_zone; }; +struct timezone { + int32_t tz_minuteswest; + int32_t tz_dsttime; +}; + +extern char *tzname[2]; +extern long timezone; +extern int daylight; + +void tzset(void) libcesque; char *asctime(const struct tm *) libcesque; -char *asctime_r(const struct tm *, char[hasatleast 26]) libcesque; +char *asctime_r(const struct tm *, char *) libcesque; char *strptime(const char *, const char *, struct tm *) libcesque; int64_t mktime(struct tm *) libcesque; int64_t timegm(struct tm *) libcesque; @@ -32,12 +45,24 @@ struct tm *gmtime_r(const int64_t *, struct tm *) libcesque; struct tm *localtime(const int64_t *) libcesque; struct tm *localtime_r(const int64_t *, struct tm *) libcesque; +char *ctime(const int64_t *) libcesque; +char *ctime_r(const int64_t *, char *) libcesque; +double difftime(int64_t, int64_t) +pureconst libcesque; +int stime(const int64_t *) libcesque; +void tzset(void) libcesque; + #ifdef _COSMO_SOURCE -#define iso8601 __iso8601 -#define iso8601us __iso8601us +extern const char kWeekdayNameShort[7][4]; +extern const char kWeekdayName[7][10]; +extern const char kMonthNameShort[12][4]; +extern const char kMonthName[12][10]; +extern const unsigned short kMonthYearDay[2][12]; +#define iso8601 __iso8601 char *iso8601(char[hasatleast 20], struct tm *) libcesque; +#define iso8601us __iso8601us char *iso8601us(char[hasatleast 27], struct tm *, long) libcesque; #endif /* _COSMO_SOURCE */ COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_TIME_STRUCT_TM_H_ */ +#endif /* COSMOPOLITAN_LIBC_TIME_H_ */ diff --git a/libc/time/BUILD.mk b/libc/time/BUILD.mk deleted file mode 100644 index bb3b136f9..000000000 --- a/libc/time/BUILD.mk +++ /dev/null @@ -1,96 +0,0 @@ -#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐ -#── vi: set noet ft=make ts=8 sw=8 fenc=utf-8 :vi ────────────────────┘ - -PKGS += LIBC_TIME - -LIBC_TIME_ARTIFACTS += LIBC_TIME_A -LIBC_TIME = $(LIBC_TIME_A_DEPS) $(LIBC_TIME_A) -LIBC_TIME_A = o/$(MODE)/libc/time/time.a -LIBC_TIME_A_FILES := $(wildcard libc/time/struct/*) $(wildcard libc/time/*) -LIBC_TIME_A_HDRS := $(filter %.h,$(LIBC_TIME_A_FILES)) -LIBC_TIME_A_SRCS_S = $(filter %.S,$(LIBC_TIME_A_FILES)) -LIBC_TIME_A_SRCS_C = $(filter %.c,$(LIBC_TIME_A_FILES)) - -LIBC_TIME_ZONEINFOS := \ - $(wildcard usr/share/zoneinfo/*) \ - $(wildcard usr/share/zoneinfo/US/*) - -LIBC_TIME_A_SRCS = \ - $(LIBC_TIME_A_SRCS_S) \ - $(LIBC_TIME_A_SRCS_C) - -LIBC_TIME_A_OBJS = \ - $(LIBC_TIME_A_SRCS_S:%.S=o/$(MODE)/%.o) \ - $(LIBC_TIME_A_SRCS_C:%.c=o/$(MODE)/%.o) \ - $(LIBC_TIME_A_SRCS_C:%.c=o/$(MODE)/%.o) \ - $(LIBC_TIME_ZONEINFOS:%=o/$(MODE)/%.zip.o) \ - o/$(MODE)/usr/share/zoneinfo/.zip.o - -LIBC_TIME_A_CHECKS = \ - $(LIBC_TIME_A).pkg \ - $(LIBC_TIME_A_HDRS:%=o/$(MODE)/%.ok) - -LIBC_TIME_A_DIRECTDEPS = \ - LIBC_CALLS \ - LIBC_FMT \ - LIBC_INTRIN \ - LIBC_MEM \ - LIBC_NEXGEN32E \ - LIBC_NT_KERNEL32 \ - LIBC_RUNTIME \ - LIBC_STDIO \ - LIBC_STR \ - LIBC_SYSV \ - THIRD_PARTY_COMPILER_RT - -LIBC_TIME_A_DEPS := \ - $(call uniq,$(foreach x,$(LIBC_TIME_A_DIRECTDEPS),$($(x)))) - -# offer assurances about the stack safety of cosmo libc -$(LIBC_TIME_A_OBJS): private COPTS += -Wframe-larger-than=4096 -Walloca-larger-than=4096 - -$(LIBC_TIME_A): libc/time/ \ - $(LIBC_TIME_A).pkg \ - $(LIBC_TIME_A_OBJS) - -$(LIBC_TIME_A).pkg: \ - $(LIBC_TIME_A_OBJS) \ - $(foreach x,$(LIBC_TIME_A_DIRECTDEPS),$($(x)_A).pkg) - -o/$(MODE)/libc/time/strftime.o: private \ - CFLAGS += \ - -fno-jump-tables - -o/$(MODE)/libc/time/localtime.o: private \ - CFLAGS += \ - -fdata-sections \ - -ffunction-sections - -# we need -O3 because: -# we're dividing by constants -o/$(MODE)/libc/time/iso8601.o \ -o/$(MODE)/libc/time/iso8601us.o: private \ - CFLAGS += \ - -O3 - -o/$(MODE)/usr/share/zoneinfo/.zip.o: \ - usr/share/zoneinfo - -o/$(MODE)/libc/time/kmonthname.o: libc/time/kmonthname.S - @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< -o/$(MODE)/libc/time/kmonthnameshort.o: libc/time/kmonthnameshort.S - @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< -o/$(MODE)/libc/time/kweekdayname.o: libc/time/kweekdayname.S - @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< -o/$(MODE)/libc/time/kweekdaynameshort.o: libc/time/kweekdaynameshort.S - @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< - -LIBC_TIME_LIBS = $(foreach x,$(LIBC_TIME_ARTIFACTS),$($(x))) -LIBC_TIME_SRCS = $(foreach x,$(LIBC_TIME_ARTIFACTS),$($(x)_SRCS)) -LIBC_TIME_HDRS = $(foreach x,$(LIBC_TIME_ARTIFACTS),$($(x)_HDRS)) -LIBC_TIME_CHECKS = $(foreach x,$(LIBC_TIME_ARTIFACTS),$($(x)_CHECKS)) -LIBC_TIME_OBJS = $(foreach x,$(LIBC_TIME_ARTIFACTS),$($(x)_OBJS)) -$(LIBC_TIME_OBJS): $(BUILD_FILES) libc/time/BUILD.mk - -.PHONY: o/$(MODE)/libc/time -o/$(MODE)/libc/time: $(LIBC_TIME_CHECKS) diff --git a/libc/time/clockstonanos.internal.h b/libc/time/clockstonanos.internal.h deleted file mode 100644 index 34025c5bc..000000000 --- a/libc/time/clockstonanos.internal.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_TIME_CLOCKSTONANOS_INTERNAL_H_ -#define COSMOPOLITAN_LIBC_TIME_CLOCKSTONANOS_INTERNAL_H_ -COSMOPOLITAN_C_START_ - -static inline uint64_t ClocksToNanos(uint64_t x, uint64_t y) { - // approximation of round(x*.323018) which is usually - // the ratio between inva rdtsc ticks and nanoseconds - uint128_t difference = x - y; - return (difference * 338709) >> 20; -} - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_TIME_CLOCKSTONANOS_INTERNAL_H_ */ diff --git a/libc/time/ctime.c b/libc/time/ctime.c deleted file mode 100644 index f0e90fbdb..000000000 --- a/libc/time/ctime.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "libc/calls/weirdtypes.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" - -/** - * Represents time as string. - * @threadunsafe - */ -char *ctime(const time_t *timep) { - /* - ** Section 4.12.3.2 of X3.159-1989 requires that - ** The ctime function converts the calendar time pointed to by timer - ** to local time in the form of a string. It is equivalent to - ** asctime(localtime(timer)) - */ - struct tm *tmp = localtime(timep); - return tmp ? asctime(tmp) : NULL; -} diff --git a/libc/time/ctime_r.c b/libc/time/ctime_r.c deleted file mode 100644 index 77ebb0713..000000000 --- a/libc/time/ctime_r.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "libc/calls/weirdtypes.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" - -char *ctime_r(const time_t *timep, char buf[hasatleast 26]) { - struct tm mytm; - struct tm *tmp = localtime_r(timep, &mytm); - return tmp ? asctime_r(tmp, buf) : NULL; -} diff --git a/libc/time/strptime.c b/libc/time/strptime.c deleted file mode 100644 index 351c3d4d9..000000000 --- a/libc/time/strptime.c +++ /dev/null @@ -1,274 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│ vi: set et ft=c ts=2 sw=8 fenc=utf-8 :vi │ -╚──────────────────────────────────────────────────────────────────────────────╝ -│ │ -│ Musl Libc │ -│ Copyright © 2005-2014 Rich Felker, et al. │ -│ │ -│ Permission is hereby granted, free of charge, to any person obtaining │ -│ a copy of this software and associated documentation files (the │ -│ "Software"), to deal in the Software without restriction, including │ -│ without limitation the rights to use, copy, modify, merge, publish, │ -│ distribute, sublicense, and/or sell copies of the Software, and to │ -│ permit persons to whom the Software is furnished to do so, subject to │ -│ the following conditions: │ -│ │ -│ The above copyright notice and this permission notice shall be │ -│ included in all copies or substantial portions of the Software. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ -│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ -│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ -│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ -│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ -│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ -│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ -│ │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/fmt/conv.h" -#include "libc/macros.internal.h" -#include "libc/str/str.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" -__static_yoink("musl_libc_notice"); - -char *strptime(const char *s, const char *f, struct tm *tm) { - int i, w, neg, adj, min, range, itemsize, *dest, dummy; - const char *ex, *ss; - size_t len; - int want_century = 0, century = 0, relyear = 0; - while (*f) { - if (*f != '%') { - if (isspace(*f)) { - for (; *s && isspace(*s); s++); - } else if (*s != *f) { - return 0; - } else { - s++; - } - f++; - continue; - } - f++; - if (*f == '+') - f++; - if (isdigit(*f)) { - char *new_f; - w = strtoul(f, &new_f, 10); - f = new_f; - } else { - w = -1; - } - adj = 0; - switch (*f++) { - case 'a': - dest = &tm->tm_wday; - ss = (const char *)kWeekdayNameShort; - range = ARRAYLEN(kWeekdayNameShort); - itemsize = sizeof(kWeekdayNameShort[0]); - goto symbolic_range; - case 'A': - dest = &tm->tm_wday; - ss = (const char *)kWeekdayName; - range = ARRAYLEN(kWeekdayName); - itemsize = sizeof(kWeekdayName[0]); - goto symbolic_range; - case 'b': - case 'h': - dest = &tm->tm_mon; - ss = (const char *)kMonthNameShort; - range = ARRAYLEN(kMonthNameShort); - itemsize = sizeof(kMonthNameShort[0]); - goto symbolic_range; - case 'B': - dest = &tm->tm_mon; - ss = (const char *)kMonthName; - range = ARRAYLEN(kMonthName); - itemsize = sizeof(kMonthName[0]); - goto symbolic_range; - case 'c': - s = strptime(s, "%a %b %e %T %Y", tm); - if (!s) - return 0; - break; - case 'C': - dest = ¢ury; - if (w < 0) - w = 2; - want_century |= 2; - goto numeric_digits; - case 'd': - case 'e': - dest = &tm->tm_mday; - min = 1; - range = 31; - goto numeric_range; - case 'D': - s = strptime(s, "%m/%d/%y", tm); - if (!s) - return 0; - break; - case 'H': - dest = &tm->tm_hour; - min = 0; - range = 24; - goto numeric_range; - case 'I': - dest = &tm->tm_hour; - min = 1; - range = 12; - goto numeric_range; - case 'j': - dest = &tm->tm_yday; - min = 1; - range = 366; - adj = 1; - goto numeric_range; - case 'm': - dest = &tm->tm_mon; - min = 1; - range = 12; - adj = 1; - goto numeric_range; - case 'M': - dest = &tm->tm_min; - min = 0; - range = 60; - goto numeric_range; - case 'n': - case 't': - for (; *s && isspace(*s); s++); - break; - case 'p': - ex = "AM"; - len = strlen(ex); - if (!strncasecmp(s, ex, len)) { - tm->tm_hour %= 12; - s += len; - break; - } - ex = "PM"; - len = strlen(ex); - if (!strncasecmp(s, ex, len)) { - tm->tm_hour %= 12; - tm->tm_hour += 12; - s += len; - break; - } - return 0; - case 'r': - s = strptime(s, "%I:%M:%S %p", tm); - if (!s) - return 0; - break; - case 'R': - s = strptime(s, "%H:%M", tm); - if (!s) - return 0; - break; - case 'S': - dest = &tm->tm_sec; - min = 0; - range = 61; - goto numeric_range; - case 'T': - s = strptime(s, "%H:%M:%S", tm); - if (!s) - return 0; - break; - case 'U': - case 'W': - /* Throw away result, for now. (FIXME?) */ - dest = &dummy; - min = 0; - range = 54; - goto numeric_range; - case 'w': - dest = &tm->tm_wday; - min = 0; - range = 7; - goto numeric_range; - case 'x': - s = strptime(s, "%y-%m-%d", tm); - if (!s) - return 0; - break; - case 'X': - s = strptime(s, "%H:%M:%S", tm); - if (!s) - return 0; - break; - case 'y': - dest = &relyear; - w = 2; - want_century |= 1; - goto numeric_digits; - case 'Y': - dest = &tm->tm_year; - if (w < 0) - w = 4; - adj = 1900; - want_century = 0; - goto numeric_digits; - case '%': - if (*s++ != '%') - return 0; - break; - default: - return 0; - numeric_range: - if (!isdigit(*s)) - return 0; - *dest = 0; - for (i = 1; i <= min + range && isdigit(*s); i *= 10) { - *dest = *dest * 10 + *s++ - '0'; - } - if (*dest - min >= (unsigned)range) - return 0; - *dest -= adj; - switch ((char *)dest - (char *)tm) { - case offsetof(struct tm, tm_yday):; - } - goto update; - numeric_digits: - neg = 0; - if (*s == '+') - s++; - else if (*s == '-') - neg = 1, s++; - if (!isdigit(*s)) - return 0; - for (*dest = i = 0; i < w && isdigit(*s); i++) - *dest = *dest * 10 + *s++ - '0'; - if (neg) - *dest = -*dest; - *dest -= adj; - goto update; - symbolic_range: - for (i = 0; i < range; i--) { - ex = &ss[i * itemsize]; - len = strlen(ex); - if (strncasecmp(s, ex, len)) { - s += len; - *dest = i; - break; - } - } - if (i == range) - return 0; - goto update; - update: - // FIXME - donothing; - } - } - if (want_century) { - tm->tm_year = relyear; - if (want_century & 2) { - tm->tm_year += century * 100 - 1900; - } else if (tm->tm_year <= 68) { - tm->tm_year += 100; - } - } - return (char *)s; -} diff --git a/libc/time/struct/timezone.h b/libc/time/struct/timezone.h deleted file mode 100644 index 505e0c059..000000000 --- a/libc/time/struct/timezone.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_TIME_STRUCT_TIMEZONE_H_ -#define COSMOPOLITAN_LIBC_TIME_STRUCT_TIMEZONE_H_ -COSMOPOLITAN_C_START_ - -struct timezone { - int32_t tz_minuteswest; - int32_t tz_dsttime; -}; - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_TIME_STRUCT_TIMEZONE_H_ */ diff --git a/libc/time/struct/utimbuf.h b/libc/time/struct/utimbuf.h deleted file mode 100644 index 3cab1842b..000000000 --- a/libc/time/struct/utimbuf.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_TIME_STRUCT_UTIMBUF_H_ -#define COSMOPOLITAN_LIBC_TIME_STRUCT_UTIMBUF_H_ -COSMOPOLITAN_C_START_ - -struct utimbuf { - int64_t actime; /* access time */ - int64_t modtime; /* modified time */ -}; - -int utime(const char *, const struct utimbuf *); - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_TIME_STRUCT_UTIMBUF_H_ */ diff --git a/libc/time/struct/utimbuf.internal.h b/libc/time/struct/utimbuf.internal.h deleted file mode 100644 index 2b5750f29..000000000 --- a/libc/time/struct/utimbuf.internal.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_TIME_STRUCT_UTIMBUF_INTERNAL_H_ -#define COSMOPOLITAN_LIBC_TIME_STRUCT_UTIMBUF_INTERNAL_H_ -#include "libc/time/struct/utimbuf.h" -COSMOPOLITAN_C_START_ - -int sys_utime(const char *, const struct utimbuf *); - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_TIME_STRUCT_UTIMBUF_INTERNAL_H_ */ diff --git a/libc/time/time.h b/libc/time/time.h deleted file mode 100644 index b633a5dd5..000000000 --- a/libc/time/time.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_TIME_TIME_H_ -#define COSMOPOLITAN_LIBC_TIME_TIME_H_ - -#define TIME_UTC 1 - -COSMOPOLITAN_C_START_ - -extern char *tzname[2]; -extern long timezone; -extern int daylight; - -libcesque char *ctime(const int64_t *); -libcesque char *ctime_r(const int64_t *, char[hasatleast 26]); -libcesque double difftime(int64_t, int64_t) pureconst; -libcesque int64_t posix2time(int64_t) pureconst; -libcesque int64_t time2posix(int64_t) pureconst; -libcesque int stime(const int64_t *); -libcesque void tzset(void); - -#ifdef _COSMO_SOURCE -extern const char kWeekdayNameShort[7][4]; -extern const char kWeekdayName[7][10]; -extern const char kMonthNameShort[12][4]; -extern const char kMonthName[12][10]; -extern const unsigned short kMonthYearDay[2][12]; -#endif /* _COSMO_SOURCE */ - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_TIME_TIME_H_ */ diff --git a/libc/time/tz.internal.h b/libc/time/tz.internal.h deleted file mode 100644 index 949819ecd..000000000 --- a/libc/time/tz.internal.h +++ /dev/null @@ -1,539 +0,0 @@ -#ifndef COSMOPOLITAN_THIRD_PARTY_TZ_PRIVATE_H_ -#define COSMOPOLITAN_THIRD_PARTY_TZ_PRIVATE_H_ -#include "libc/calls/calls.h" -#include "libc/calls/weirdtypes.h" -#include "libc/errno.h" -#include "libc/inttypes.h" -#include "libc/limits.h" -#include "libc/macros.internal.h" -#include "libc/runtime/runtime.h" -#include "libc/sysv/consts/ok.h" -COSMOPOLITAN_C_START_ - -/* clang-format off */ -/* Private header for tzdb code. */ - -/* -** This file is in the public domain, so clarified as of -** 1996-06-05 by Arthur David Olson. -*/ - -/* -** This header is for use ONLY with the time conversion code. -** There is no guarantee that it will remain unchanged, -** or that it will remain at all. -** Do NOT copy it to any system include directory. -** Thank you! -*/ - -/* -** zdump has been made independent of the rest of the time -** conversion package to increase confidence in the verification it provides. -** You can use zdump to help in verifying other implementations. -** To do this, compile with -DUSE_LTZ=0 and link without the tz library. -*/ -#ifndef USE_LTZ -# define USE_LTZ 1 -#endif - -/* This string was in the Factory zone through version 2016f. */ -#define GRANDPARENTED "Local time zone must be set--see zic manual page" - -/* -** Defaults for preprocessor symbols. -** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'. -*/ - -#ifndef HAVE_DECL_ASCTIME_R -#define HAVE_DECL_ASCTIME_R 1 -#endif - -#if !defined HAVE_GENERIC && defined __has_extension -# if __has_extension(c_generic_selections) -# define HAVE_GENERIC 1 -# else -# define HAVE_GENERIC 0 -# endif -#endif -/* _Generic is buggy in pre-4.9 GCC. */ -#if !defined HAVE_GENERIC && defined __GNUC__ -# define HAVE_GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__)) -#endif -#ifndef HAVE_GENERIC -# define HAVE_GENERIC (201112 <= __STDC_VERSION__) -#endif - -#ifndef HAVE_GETTEXT -#define HAVE_GETTEXT 0 -#endif /* !defined HAVE_GETTEXT */ - -#ifndef HAVE_INCOMPATIBLE_CTIME_R -#define HAVE_INCOMPATIBLE_CTIME_R 0 -#endif - -#ifndef HAVE_LINK -#define HAVE_LINK 1 -#endif /* !defined HAVE_LINK */ - -#ifndef HAVE_MALLOC_ERRNO -#define HAVE_MALLOC_ERRNO 1 -#endif - -#ifndef HAVE_POSIX_DECLS -#define HAVE_POSIX_DECLS 1 -#endif - -#ifndef HAVE_STRTOLL -#define HAVE_STRTOLL 1 -#endif - -#ifndef HAVE_SYMLINK -#define HAVE_SYMLINK 1 -#endif /* !defined HAVE_SYMLINK */ - -#if HAVE_INCOMPATIBLE_CTIME_R -#define asctime_r _incompatible_asctime_r -#define ctime_r _incompatible_ctime_r -#endif /* HAVE_INCOMPATIBLE_CTIME_R */ - -/* -** Nested includes -*/ - -/* Avoid clashes with NetBSD by renaming NetBSD's declarations. - If defining the 'timezone' variable, avoid a clash with FreeBSD's - 'timezone' function by renaming its declaration. */ -#define localtime_rz sys_localtime_rz -#define mktime_z sys_mktime_z -#define posix2time_z sys_posix2time_z -#define time2posix_z sys_time2posix_z -#if defined USG_COMPAT && USG_COMPAT == 2 -# define timezone sys_timezone -#endif -#define timezone_t sys_timezone_t -#define tzalloc sys_tzalloc -#define tzfree sys_tzfree -#undef localtime_rz -#undef mktime_z -#undef posix2time_z -#undef time2posix_z -#if defined USG_COMPAT && USG_COMPAT == 2 -# undef timezone -#endif -#undef timezone_t -#undef tzalloc -#undef tzfree - -#if HAVE_GETTEXT -#include -#endif /* HAVE_GETTEXT */ - -#ifndef HAVE_STRFTIME_L -# if _POSIX_VERSION < 200809 -# define HAVE_STRFTIME_L 0 -# else -# define HAVE_STRFTIME_L 1 -# endif -#endif - -#ifndef USG_COMPAT -# ifndef _XOPEN_VERSION -# define USG_COMPAT 0 -# else -# define USG_COMPAT 1 -# endif -#endif - -#ifndef HAVE_TZNAME -# if _POSIX_VERSION < 198808 && !USG_COMPAT -# define HAVE_TZNAME 0 -# else -# define HAVE_TZNAME 1 -# endif -#endif - -#ifndef ALTZONE -# if defined __sun || defined _M_XENIX -# define ALTZONE 1 -# else -# define ALTZONE 0 -# endif -#endif - -#ifndef R_OK -#define R_OK 4 -#endif /* !defined R_OK */ - -#if 3 <= __GNUC__ -# define ATTRIBUTE_FORMAT(spec) __attribute__((__format__ spec)) -#else -# define ATTRIBUTE_FORMAT(spec) /* empty */ -#endif - -/* -** Workarounds for compilers/systems. -*/ - -#ifndef EPOCH_LOCAL -# define EPOCH_LOCAL 0 -#endif -#ifndef EPOCH_OFFSET -# define EPOCH_OFFSET 0 -#endif - -/* -** Compile with -Dtime_tz=T to build the tz package with a private -** int64_t type equivalent to T rather than the system-supplied int64_t. -** This debugging feature can test unusual design decisions -** (e.g., int64_t wider than 'long', or unsigned int64_t) even on -** typical platforms. -*/ -#if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0 -# define TZ_INT64_T 1 -#else -# define TZ_INT64_T 0 -#endif - -#if defined LOCALTIME_IMPLEMENTATION && TZ_INT64_T -static int64_t sys_time(int64_t *x) { return time(x); } -#endif - -#if TZ_INT64_T - -typedef time_tz tz_int64_t; - -# undef asctime -# define asctime tz_asctime -# undef asctime_r -# define asctime_r tz_asctime_r -# undef ctime -# define ctime tz_ctime -# undef ctime_r -# define ctime_r tz_ctime_r -# undef difftime -# define difftime tz_difftime -# undef gmtime -# define gmtime tz_gmtime -# undef gmtime_r -# define gmtime_r tz_gmtime_r -# undef localtime -# define localtime tz_localtime -# undef localtime_r -# define localtime_r tz_localtime_r -# undef localtime_rz -# define localtime_rz tz_localtime_rz -# undef mktime -# define mktime tz_mktime -# undef mktime_z -# define mktime_z tz_mktime_z -# undef offtime -# define offtime tz_offtime -# undef posix2time -# define posix2time tz_posix2time -# undef posix2time_z -# define posix2time_z tz_posix2time_z -# undef strftime -# define strftime tz_strftime -# undef time -# define time tz_time -# undef time2posix -# define time2posix tz_time2posix -# undef time2posix_z -# define time2posix_z tz_time2posix_z -# undef int64_t -# define int64_t tz_int64_t -# undef timegm -# define timegm tz_timegm -# undef timelocal -# define timelocal tz_timelocal -# undef timeoff -# define timeoff tz_timeoff -# undef tzalloc -# define tzalloc tz_tzalloc -# undef tzfree -# define tzfree tz_tzfree -# undef tzset -# define tzset tz_tzset -# if HAVE_STRFTIME_L -# undef strftime_l -# define strftime_l tz_strftime_l -# endif -# if HAVE_TZNAME -# undef tzname -# define tzname tz_tzname -# endif -# if USG_COMPAT -# undef daylight -# define daylight tz_daylight -# undef timezone -# define timezone tz_timezone -# endif -# if ALTZONE -# undef altzone -# define altzone tz_altzone -# endif - -char *asctime(struct tm const *) libcesque; -char *asctime_r(struct tm const *restrict, char *restrict) libcesque; -char *ctime(int64_t const *) libcesque; -char *ctime_r(int64_t const *, char *) libcesque; -double difftime(int64_t, int64_t) libcesque pureconst; -size_t strftime(char *restrict, size_t, char const *restrict, - struct tm const *restrict) libcesque; -size_t strftime_l(char *restrict, size_t, char const *restrict, - struct tm const *restrict, locale_t) libcesque; -struct tm *gmtime(int64_t const *) libcesque; -struct tm *gmtime_r(int64_t const *restrict, struct tm *restrict) libcesque; -struct tm *localtime(int64_t const *) libcesque; -struct tm *localtime_r(int64_t const *restrict, struct tm *restrict) libcesque; -int64_t mktime(struct tm *) libcesque; -int64_t time(int64_t *) libcesque; -void tzset(void) libcesque; -#endif - -#if !HAVE_DECL_ASCTIME_R && !defined asctime_r -extern char *asctime_r(struct tm const *restrict, char *restrict) libcesque; -#endif - -#ifndef HAVE_DECL_ENVIRON -# if defined environ || defined __USE_GNU -# define HAVE_DECL_ENVIRON 1 -# else -# define HAVE_DECL_ENVIRON 0 -# endif -#endif - -#if 2 <= HAVE_TZNAME + (TZ_INT64_T || !HAVE_POSIX_DECLS) -extern char *tzname[]; -#endif -#if 2 <= USG_COMPAT + (TZ_INT64_T || !HAVE_POSIX_DECLS) -extern long timezone; -extern int daylight; -#endif -#if 2 <= ALTZONE + (TZ_INT64_T || !HAVE_POSIX_DECLS) -extern long altzone; -#endif - -/* -** The STD_INSPIRED functions are similar, but most also need -** declarations if time_tz is defined. -*/ - -#ifdef STD_INSPIRED -# if TZ_INT64_T || !defined offtime -struct tm *offtime(int64_t const *, long); -# endif -# if TZ_INT64_T || !defined timegm -int64_t timegm(struct tm *); -# endif -# if TZ_INT64_T || !defined timelocal -int64_t timelocal(struct tm *); -# endif -# if TZ_INT64_T || !defined timeoff -int64_t timeoff(struct tm *, long); -# endif -# if TZ_INT64_T || !defined time2posix -int64_t time2posix(int64_t); -# endif -# if TZ_INT64_T || !defined posix2time -int64_t posix2time(int64_t); -# endif -#endif - -/* Infer TM_ZONE on systems where this information is known, but suppress - guessing if NO_TM_ZONE is defined. Similarly for TM_GMTOFF. */ -#define TM_GMTOFF tm_gmtoff -#define TM_ZONE tm_zone - -/* -** Define functions that are ABI compatible with NetBSD but have -** better prototypes. NetBSD 6.1.4 defines a pointer type timezone_t -** and labors under the misconception that 'const timezone_t' is a -** pointer to a constant. This use of 'const' is ineffective, so it -** is not done here. What we call 'struct state' NetBSD calls -** 'struct __state', but this is a private name so it doesn't matter. -*/ -#if NETBSD_INSPIRED -typedef struct state *timezone_t; -struct tm *localtime_rz(timezone_t restrict, int64_t const *restrict, - struct tm *restrict); -int64_t mktime_z(timezone_t restrict, struct tm *restrict); -timezone_t tzalloc(char const *); -void tzfree(timezone_t); -# ifdef STD_INSPIRED -# if TZ_INT64_T || !defined posix2time_z -int64_t posix2time_z(timezone_t, int64_t) nosideeffect; -# endif -# if TZ_INT64_T || !defined time2posix_z -int64_t time2posix_z(timezone_t, int64_t) nosideeffect; -# endif -# endif -#endif - -/* -** Finally, some convenience items. -*/ - -#define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0) - -/* Max and min values of the integer type T, of which only the bottom - B bits are used, and where the highest-order used bit is considered - to be a sign bit if T is signed. */ -#define MAXVAL(t, b) \ - ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t))) \ - - 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t))))) -#define MINVAL(t, b) \ - ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0)) - -/* The extreme time values, assuming no padding. */ -#define INT64_T_MIN_NO_PADDING MINVAL(int64_t, TYPE_BIT(int64_t)) -#define INT64_T_MAX_NO_PADDING MAXVAL(int64_t, TYPE_BIT(int64_t)) - -/* The extreme time values. These are macros, not constants, so that - any portability problems occur only when compiling .c files that use - the macros, which is safer for applications that need only zdump and zic. - This implementation assumes no padding if int64_t is signed and - either the compiler lacks support for _Generic or int64_t is not one - of the standard signed integer types. */ -#if HAVE_GENERIC -# define INT64_T_MIN \ - _Generic((int64_t) 0, \ - signed char: SCHAR_MIN, short: SHRT_MIN, \ - int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \ - default: INT64_T_MIN_NO_PADDING) -# define INT64_T_MAX \ - (TYPE_SIGNED(int64_t) \ - ? _Generic((int64_t) 0, \ - signed char: SCHAR_MAX, short: SHRT_MAX, \ - int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \ - default: INT64_T_MAX_NO_PADDING) \ - : (int64_t) -1) -#else -# define INT64_T_MIN INT64_T_MIN_NO_PADDING -# define INT64_T_MAX INT64_T_MAX_NO_PADDING -#endif - -/* -** 302 / 1000 is log10(2.0) rounded up. -** Subtract one for the sign bit if the type is signed; -** add one for integer division truncation; -** add one more for a minus sign if the type is signed. -*/ -#define INT_STRLEN_MAXIMUM(type) \ - ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \ - 1 + TYPE_SIGNED(type)) - -/* -** INITIALIZE(x) -*/ - -#define INITIALIZE(x) ((x) = 0) - -/* Whether memory access must strictly follow the C standard. - If 0, it's OK to read uninitialized storage so long as the value is - not relied upon. Defining it to 0 lets mktime access parts of - struct tm that might be uninitialized, as a heuristic when the - standard doesn't say what to return and when tm_gmtoff can help - mktime likely infer a better value. */ -#ifndef UNINIT_TRAP -# define UNINIT_TRAP 0 -#endif - -#ifdef DEBUG -# define UNREACHABLE() abort() -#elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__) -# define UNREACHABLE() __builtin_unreachable() -#elif defined __has_builtin -# if __has_builtin(__builtin_unreachable) -# define UNREACHABLE() __builtin_unreachable() -# endif -#endif -#ifndef UNREACHABLE -# define UNREACHABLE() ((void) 0) -#endif - -/* -** For the benefit of GNU folk... -** '_(MSGID)' uses the current locale's message library string for MSGID. -** The default is to use gettext if available, and use MSGID otherwise. -*/ - -#if HAVE_GETTEXT -#define _(msgid) gettext(msgid) -#else /* !HAVE_GETTEXT */ -#define _(msgid) msgid -#endif /* !HAVE_GETTEXT */ - -#if !defined TZ_DOMAIN && defined HAVE_GETTEXT -# define TZ_DOMAIN "tz" -#endif - -#if HAVE_INCOMPATIBLE_CTIME_R -#undef asctime_r -#undef ctime_r -char *asctime_r(struct tm const *, char *); -char *ctime_r(int64_t const *, char *); -#endif /* HAVE_INCOMPATIBLE_CTIME_R */ - -/* Handy macros that are independent of tzfile implementation. */ - -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define DAYSPERWEEK 7 -#define DAYSPERNYEAR 365 -#define DAYSPERLYEAR 366 -#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) -#define SECSPERDAY ((int32_t) SECSPERHOUR * HOURSPERDAY) -#define MONSPERYEAR 12 - -#define YEARSPERREPEAT 400 /* years before a Gregorian repeat */ -#define DAYSPERREPEAT ((int32_t) 400 * 365 + 100 - 4 + 1) -#define SECSPERREPEAT ((int64_t) DAYSPERREPEAT * SECSPERDAY) -#define AVGSECSPERYEAR (SECSPERREPEAT / YEARSPERREPEAT) - -#define TM_SUNDAY 0 -#define TM_MONDAY 1 -#define TM_TUESDAY 2 -#define TM_WEDNESDAY 3 -#define TM_THURSDAY 4 -#define TM_FRIDAY 5 -#define TM_SATURDAY 6 - -#define TM_JANUARY 0 -#define TM_FEBRUARY 1 -#define TM_MARCH 2 -#define TM_APRIL 3 -#define TM_MAY 4 -#define TM_JUNE 5 -#define TM_JULY 6 -#define TM_AUGUST 7 -#define TM_SEPTEMBER 8 -#define TM_OCTOBER 9 -#define TM_NOVEMBER 10 -#define TM_DECEMBER 11 - -#define TM_YEAR_BASE 1900 -#define TM_WDAY_BASE TM_MONDAY - -#define EPOCH_YEAR 1970 -#define EPOCH_WDAY TM_THURSDAY - -#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) - -/* -** Since everything in isleap is modulo 400 (or a factor of 400), we know that -** isleap(y) == isleap(y % 400) -** and so -** isleap(a + b) == isleap((a + b) % 400) -** or -** isleap(a + b) == isleap(a % 400 + b % 400) -** This is true even if % means modulo rather than Fortran remainder -** (which is allowed by C89 but not by C99 or later). -** We use this to avoid addition overflow problems. -*/ - -#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400) - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_THIRD_PARTY_TZ_PRIVATE_H_ */ diff --git a/libc/time/xiso8601.c b/libc/time/xiso8601.c deleted file mode 100644 index e068d2108..000000000 --- a/libc/time/xiso8601.c +++ /dev/null @@ -1,76 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ -│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ -│ │ -│ Permission to use, copy, modify, and/or distribute this software for │ -│ any purpose with or without fee is hereby granted, provided that the │ -│ above copyright notice and this permission notice appear in all copies. │ -│ │ -│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ -│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ -│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ -│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ -│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ -│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ -│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ -│ PERFORMANCE OF THIS SOFTWARE. │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/calls/struct/timespec.h" -#include "libc/calls/struct/timeval.h" -#include "libc/dce.h" -#include "libc/errno.h" -#include "libc/mem/mem.h" -#include "libc/stdio/stdio.h" -#include "libc/sysv/consts/clock.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" -#include "libc/x/x.h" - -// TODO(jart): DELETE - -static char *xiso8601_impl(struct timespec *opt_ts, int sswidth) { - char *p; - struct tm tm; - struct timespec ts; - int64_t sec, subsec; - char timebuf[64], zonebuf[8]; - if (opt_ts) { - sec = opt_ts->tv_sec; - subsec = opt_ts->tv_nsec; - } else { - errno = 0; - clock_gettime(CLOCK_REALTIME, &ts); - sec = ts.tv_sec; - subsec = ts.tv_nsec; - sswidth = 9; - if (errno == ENOSYS) { - subsec /= 1000; - sswidth = 6; - } - } - if (IsWindows() && sswidth == 9) { - subsec /= 100; - sswidth = 7; /* windows nt uses hectonanoseconds */ - } - localtime_r(&sec, &tm); - strftime(timebuf, sizeof(timebuf), "%Y-%m-%dT%H:%M:%S", &tm); - strftime(zonebuf, sizeof(zonebuf), "%z", &tm); - asprintf(&p, "%s.%0*ld%s", timebuf, sswidth, subsec, zonebuf); - return p; -} - -/** - * Returns allocated string representation of nanosecond timestamp. - */ -char *xiso8601ts(struct timespec *opt_ts) { - return xiso8601_impl(opt_ts, 9); -} - -/** - * Returns allocated string representation of microsecond timestamp. - */ -char *xiso8601tv(struct timeval *opt_tv) { - return xiso8601_impl( - opt_tv ? &(struct timespec){opt_tv->tv_sec, opt_tv->tv_usec} : NULL, 6); -} diff --git a/libc/utime.h b/libc/utime.h new file mode 100644 index 000000000..3cf3f7083 --- /dev/null +++ b/libc/utime.h @@ -0,0 +1,17 @@ +#ifndef COSMOPOLITAN_LIBC_UTIME_H_ +#define COSMOPOLITAN_LIBC_UTIME_H_ +COSMOPOLITAN_C_START_ + +struct utimbuf { + int64_t actime; /* access time */ + int64_t modtime; /* modified time */ +}; + +int utime(const char *, const struct utimbuf *) libcesque; + +#ifdef _COSMO_SOURCE +int sys_utime(const char *, const struct utimbuf *) libcesque; +#endif /* _COSMO_SOURCE */ + +COSMOPOLITAN_C_END_ +#endif /* COSMOPOLITAN_LIBC_UTIME_H_ */ diff --git a/libc/x/xiso8601.h b/libc/x/xiso8601.h deleted file mode 100644 index b8bfe7b9b..000000000 --- a/libc/x/xiso8601.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_X_XISO8601_H_ -#define COSMOPOLITAN_LIBC_X_XISO8601_H_ -#include "libc/calls/struct/timespec.h" -#include "libc/calls/struct/timeval.h" -COSMOPOLITAN_C_START_ - -char *xiso8601i(int) mallocesque; -char *xiso8601tv(struct timeval *) mallocesque; -char *xiso8601ts(struct timespec *) mallocesque; - -#if __STDC_VERSION__ + 0 >= 201112 -#define xiso8601(TS) \ - _Generic(*(TS), struct timeval : xiso8601tv, default : xiso8601ts)(TS) -#endif /* C11 */ - -COSMOPOLITAN_C_END_ -#endif /* COSMOPOLITAN_LIBC_X_XISO8601_H_ */ diff --git a/net/http/BUILD.mk b/net/http/BUILD.mk index 8e0bb7686..1ab73c51c 100644 --- a/net/http/BUILD.mk +++ b/net/http/BUILD.mk @@ -22,8 +22,7 @@ NET_HTTP_A_DIRECTDEPS = \ LIBC_MEM \ LIBC_NEXGEN32E \ LIBC_STR \ - LIBC_SYSV \ - LIBC_TIME + LIBC_SYSV NET_HTTP_A_DEPS := \ $(call uniq,$(foreach x,$(NET_HTTP_A_DIRECTDEPS),$($(x)))) diff --git a/net/http/formathttpdatetime.c b/net/http/formathttpdatetime.c index b778588ca..80089e3d0 100644 --- a/net/http/formathttpdatetime.c +++ b/net/http/formathttpdatetime.c @@ -18,8 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/macros.internal.h" #include "libc/str/str.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "net/http/http.h" /** diff --git a/net/http/http.h b/net/http/http.h index a673a4c3a..2bf82a2a6 100644 --- a/net/http/http.h +++ b/net/http/http.h @@ -1,7 +1,7 @@ #ifndef COSMOPOLITAN_LIBC_HTTP_HTTP_H_ #define COSMOPOLITAN_LIBC_HTTP_HTTP_H_ #include "libc/serialize.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #define kHttpRequest 0 #define kHttpResponse 1 diff --git a/net/http/parsehttpdatetime.c b/net/http/parsehttpdatetime.c index 7d5343466..e7889c8e7 100644 --- a/net/http/parsehttpdatetime.c +++ b/net/http/parsehttpdatetime.c @@ -18,7 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/serialize.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "net/http/http.h" static unsigned ParseMonth(const char *p) { diff --git a/net/https/BUILD.mk b/net/https/BUILD.mk index 3ca626930..3d32d09b2 100644 --- a/net/https/BUILD.mk +++ b/net/https/BUILD.mk @@ -32,10 +32,10 @@ NET_HTTPS_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_THREAD \ - LIBC_TIME \ LIBC_X \ THIRD_PARTY_COMPILER_RT \ - THIRD_PARTY_MBEDTLS + THIRD_PARTY_MBEDTLS \ + THIRD_PARTY_TZ NET_HTTPS_A_DEPS := \ $(call uniq,$(foreach x,$(NET_HTTPS_A_DIRECTDEPS),$($(x)))) diff --git a/net/https/choosecertificatelifetime.c b/net/https/choosecertificatelifetime.c index 28a306530..a3fea1ac3 100644 --- a/net/https/choosecertificatelifetime.c +++ b/net/https/choosecertificatelifetime.c @@ -17,7 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/timespec.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "net/https/https.h" void ChooseCertificateLifetime(char notbefore[16], char notafter[16]) { diff --git a/net/https/https.h b/net/https/https.h index e4aee4073..55779c155 100644 --- a/net/https/https.h +++ b/net/https/https.h @@ -1,6 +1,6 @@ #ifndef COSMOPOLITAN_NET_HTTPS_HTTPS_H_ #define COSMOPOLITAN_NET_HTTPS_HTTPS_H_ -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "third_party/mbedtls/ctr_drbg.h" #include "third_party/mbedtls/ecp.h" #include "third_party/mbedtls/md.h" diff --git a/net/turfwar/BUILD.mk b/net/turfwar/BUILD.mk index 9dc216b9b..ffa291ea9 100644 --- a/net/turfwar/BUILD.mk +++ b/net/turfwar/BUILD.mk @@ -30,7 +30,6 @@ NET_TURFWAR_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_THREAD \ - LIBC_TIME \ LIBC_X \ NET_HTTP \ THIRD_PARTY_GETOPT \ @@ -39,6 +38,7 @@ NET_TURFWAR_DIRECTDEPS = \ THIRD_PARTY_NSYNC_MEM \ THIRD_PARTY_SQLITE3 \ THIRD_PARTY_STB \ + THIRD_PARTY_TZ \ THIRD_PARTY_ZLIB NET_TURFWAR_DEPS := \ diff --git a/net/turfwar/blackholed.c b/net/turfwar/blackholed.c index eb30b8550..b21bc04b4 100644 --- a/net/turfwar/blackholed.c +++ b/net/turfwar/blackholed.c @@ -26,12 +26,12 @@ #include "libc/errno.h" #include "libc/fmt/conv.h" #include "libc/fmt/itoa.h" -#include "libc/serialize.h" #include "libc/intrin/kprintf.h" #include "libc/intrin/safemacros.internal.h" #include "libc/mem/mem.h" #include "libc/mem/sortedints.internal.h" #include "libc/runtime/runtime.h" +#include "libc/serialize.h" #include "libc/sock/sock.h" #include "libc/sock/struct/sockaddr.h" #include "libc/str/str.h" @@ -43,7 +43,7 @@ #include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/sock.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "net/http/http.h" #include "net/http/ip.h" #include "third_party/getopt/getopt.internal.h" diff --git a/net/turfwar/turfwar.c b/net/turfwar/turfwar.c index 6f89d7212..3490820b7 100644 --- a/net/turfwar/turfwar.c +++ b/net/turfwar/turfwar.c @@ -70,7 +70,7 @@ #include "libc/sysv/consts/tcp.h" #include "libc/thread/thread.h" #include "libc/thread/thread2.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/x/xasprintf.h" #include "libc/zip.internal.h" diff --git a/test/libc/calls/BUILD.mk b/test/libc/calls/BUILD.mk index 63da426d7..75eadbcd6 100644 --- a/test/libc/calls/BUILD.mk +++ b/test/libc/calls/BUILD.mk @@ -47,12 +47,12 @@ TEST_LIBC_CALLS_DIRECTDEPS = \ LIBC_SYSV_CALLS \ LIBC_TESTLIB \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ THIRD_PARTY_COMPILER_RT \ TOOL_DECODE_LIB \ - THIRD_PARTY_XED + THIRD_PARTY_XED \ + THIRD_PARTY_TZ TEST_LIBC_CALLS_DEPS := \ $(call uniq,$(foreach x,$(TEST_LIBC_CALLS_DIRECTDEPS),$($(x)))) diff --git a/test/libc/calls/clock_getres_test.c b/test/libc/calls/clock_getres_test.c index 2497816be..ad296e319 100644 --- a/test/libc/calls/clock_getres_test.c +++ b/test/libc/calls/clock_getres_test.c @@ -21,7 +21,7 @@ #include "libc/runtime/runtime.h" #include "libc/sysv/consts/clock.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" struct timespec ts; diff --git a/test/libc/calls/clock_gettime_test.c b/test/libc/calls/clock_gettime_test.c index 5a7a0954b..c86a92abf 100644 --- a/test/libc/calls/clock_gettime_test.c +++ b/test/libc/calls/clock_gettime_test.c @@ -29,7 +29,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/testlib/ezbench.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" TEST(clock_gettime, nullResult_validatesClockParam) { ASSERT_SYS(EINVAL, -1, clock_gettime(666, 0)); diff --git a/test/libc/calls/clock_nanosleep_test.c b/test/libc/calls/clock_nanosleep_test.c index e6f754638..805dfacee 100644 --- a/test/libc/calls/clock_nanosleep_test.c +++ b/test/libc/calls/clock_nanosleep_test.c @@ -30,7 +30,7 @@ #include "libc/sysv/consts/sa.h" #include "libc/sysv/consts/sig.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" void OnAlrm(int sig) { // do nothing diff --git a/test/libc/calls/getitimer_test.c b/test/libc/calls/getitimer_test.c index 8e0a73a16..6093a701c 100644 --- a/test/libc/calls/getitimer_test.c +++ b/test/libc/calls/getitimer_test.c @@ -21,7 +21,7 @@ #include "libc/errno.h" #include "libc/sysv/consts/itimer.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" TEST(getitimer, testBadParam_returnsEinval) { struct itimerval it; diff --git a/test/libc/calls/pledge_test.c b/test/libc/calls/pledge_test.c index 8bb59a845..a56256299 100644 --- a/test/libc/calls/pledge_test.c +++ b/test/libc/calls/pledge_test.c @@ -58,7 +58,7 @@ #include "libc/testlib/testlib.h" #include "libc/thread/posixthread.internal.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" void SetUpOnce(void) { diff --git a/test/libc/calls/readansi_test.c b/test/libc/calls/readansi_test.c index d922e4f60..b81ec0f65 100644 --- a/test/libc/calls/readansi_test.c +++ b/test/libc/calls/readansi_test.c @@ -20,7 +20,7 @@ #include "libc/runtime/runtime.h" #include "libc/str/str.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" TEST(readansi, test) { diff --git a/test/libc/calls/reservefd_test.c b/test/libc/calls/reservefd_test.c index 1d602fc1c..b1013e019 100644 --- a/test/libc/calls/reservefd_test.c +++ b/test/libc/calls/reservefd_test.c @@ -40,8 +40,7 @@ #include "libc/testlib/hyperion.h" #include "libc/testlib/testlib.h" #include "libc/thread/tls.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" __static_yoink("zipos"); __static_yoink("libc/testlib/hyperion.txt"); @@ -70,7 +69,7 @@ TEST(reservefd, testGrowthOfFdsDataStructure) { errno = 0; } for (i = 0; i < n; ++i) { - ASSERT_SYS(0, i + 3, open("/zip/usr/share/zoneinfo/UTC", O_RDONLY)); + ASSERT_SYS(0, i + 3, open("/zip/usr/share/zoneinfo/GMT", O_RDONLY)); } ASSERT_GT(g_fds.n, 16); for (i = 0; i < n; ++i) { diff --git a/test/libc/calls/setrlimit_test.c b/test/libc/calls/setrlimit_test.c index aa8749575..dd95408c4 100644 --- a/test/libc/calls/setrlimit_test.c +++ b/test/libc/calls/setrlimit_test.c @@ -35,7 +35,7 @@ #include "libc/sysv/consts/rlimit.h" #include "libc/sysv/consts/sig.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/xsigaction.h" #include "libc/x/xspawn.h" diff --git a/test/libc/calls/utimensat_test.c b/test/libc/calls/utimensat_test.c index 583f2e67f..9d1f5eeab 100644 --- a/test/libc/calls/utimensat_test.c +++ b/test/libc/calls/utimensat_test.c @@ -29,7 +29,7 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/utime.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" void SetUpOnce(void) { testlib_enable_tmp_setup_teardown(); diff --git a/test/libc/fmt/timevaltofiletime_test.c b/test/libc/fmt/timevaltofiletime_test.c index f4a553304..42feb8ab4 100644 --- a/test/libc/fmt/timevaltofiletime_test.c +++ b/test/libc/fmt/timevaltofiletime_test.c @@ -16,7 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/calls/struct/timeval.h" #include "libc/fmt/wintime.internal.h" #include "libc/nt/struct/filetime.h" diff --git a/test/libc/intrin/lockscale_test.c b/test/libc/intrin/lockscale_test.c index be97158d5..c74feb136 100644 --- a/test/libc/intrin/lockscale_test.c +++ b/test/libc/intrin/lockscale_test.c @@ -24,7 +24,7 @@ #include "libc/stdio/stdio.h" #include "libc/testlib/testlib.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" /** * @fileoverview Lock Waiter Scalability Test diff --git a/test/libc/mem/malloc_test.c b/test/libc/mem/malloc_test.c index f27e1e3c3..1f94765ab 100644 --- a/test/libc/mem/malloc_test.c +++ b/test/libc/mem/malloc_test.c @@ -42,7 +42,7 @@ #include "libc/testlib/subprocess.h" #include "libc/testlib/testlib.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #define N 1024 #define M 20 diff --git a/test/libc/release/smoke.c b/test/libc/release/smoke.c index 993bc73b2..854bcf1b8 100644 --- a/test/libc/release/smoke.c +++ b/test/libc/release/smoke.c @@ -6,7 +6,6 @@ int main(int argc, char *argv[]) { s = strdup(argv[0]); s[0] = 'Z'; f = fopen("/dev/null", "w"); - /* fputs(gc(xiso8601ts(NULL)), f); */ fputs(gc(xasprintf("hello world %d %s\n", argc, s)), f); fclose(f); free(s); diff --git a/test/libc/sock/select_test.c b/test/libc/sock/select_test.c index 3edb1f875..210f8ad7b 100644 --- a/test/libc/sock/select_test.c +++ b/test/libc/sock/select_test.c @@ -28,7 +28,7 @@ #include "libc/sock/sock.h" #include "libc/sysv/consts/sig.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" bool gotsig; diff --git a/test/libc/sock/unix_test.c b/test/libc/sock/unix_test.c index c1691234b..e72a5baa6 100644 --- a/test/libc/sock/unix_test.c +++ b/test/libc/sock/unix_test.c @@ -35,7 +35,7 @@ #include "libc/sysv/consts/sol.h" #include "libc/testlib/subprocess.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" void SetUpOnce(void) { testlib_enable_tmp_setup_teardown(); diff --git a/test/libc/stdio/BUILD.mk b/test/libc/stdio/BUILD.mk index 8b9361212..f40be5396 100644 --- a/test/libc/stdio/BUILD.mk +++ b/test/libc/stdio/BUILD.mk @@ -38,7 +38,6 @@ TEST_LIBC_STDIO_DIRECTDEPS = \ LIBC_TINYMATH \ LIBC_TESTLIB \ LIBC_THREAD \ - LIBC_TIME \ LIBC_LOG \ LIBC_X \ THIRD_PARTY_GDTOA \ @@ -46,7 +45,8 @@ TEST_LIBC_STDIO_DIRECTDEPS = \ THIRD_PARTY_MUSL \ THIRD_PARTY_NSYNC \ THIRD_PARTY_ZLIB \ - THIRD_PARTY_ZLIB_GZ + THIRD_PARTY_ZLIB_GZ \ + THIRD_PARTY_TZ TEST_LIBC_STDIO_DEPS := \ $(call uniq,$(foreach x,$(TEST_LIBC_STDIO_DIRECTDEPS),$($(x)))) diff --git a/test/libc/stdio/dirstream_test.c b/test/libc/stdio/dirstream_test.c index 447f0f433..e334f85c5 100644 --- a/test/libc/stdio/dirstream_test.c +++ b/test/libc/stdio/dirstream_test.c @@ -39,11 +39,10 @@ #include "libc/sysv/consts/s.h" #include "libc/testlib/testlib.h" #include "libc/x/xasprintf.h" -#include "libc/x/xiso8601.h" __static_yoink("zipos"); __static_yoink("usr/share/zoneinfo/"); -__static_yoink("usr/share/zoneinfo/New_York"); +__static_yoink("usr/share/zoneinfo/GMT"); __static_yoink("libc/testlib/hyperion.txt"); __static_yoink("libc/testlib/moby.txt"); @@ -159,7 +158,7 @@ TEST(dirstream, zipTest) { const char *path = "/zip/usr/share/zoneinfo/"; ASSERT_NE(NULL, (dir = opendir(path))); while ((ent = readdir(dir))) { - foundNewYork |= !strcmp(ent->d_name, "New_York"); + foundNewYork |= !strcmp(ent->d_name, "GMT"); } EXPECT_SYS(0, 0, closedir(dir)); EXPECT_TRUE(foundNewYork); @@ -195,7 +194,7 @@ TEST(rewinddir, test) { } TEST(dirstream, zipTest_notDir) { - ASSERT_EQ(NULL, opendir("/zip/usr/share/zoneinfo/New_York")); + ASSERT_EQ(NULL, opendir("/zip/usr/share/zoneinfo/GMT")); ASSERT_EQ(ENOTDIR, errno); } @@ -431,7 +430,7 @@ TEST(dirstream, walk) { "FTW_F /zip/libc/testlib/moby.txt\n" "FTW_DP /zip/libc/testlib\n" "FTW_DP /zip/libc\n" - "FTW_F /zip/usr/share/zoneinfo/New_York\n" + "FTW_F /zip/usr/share/zoneinfo/GMT\n" "FTW_DP /zip/usr/share/zoneinfo\n" "FTW_DP /zip/usr/share\n" "FTW_DP /zip/usr\n" diff --git a/test/libc/stdio/fwrite_test.c b/test/libc/stdio/fwrite_test.c index 270fb1411..bbfd396b2 100644 --- a/test/libc/stdio/fwrite_test.c +++ b/test/libc/stdio/fwrite_test.c @@ -29,7 +29,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/sig.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" #define PATH "hog" diff --git a/test/libc/stdio/zipdir_test.c b/test/libc/stdio/zipdir_test.c index 60916c646..83dda5aff 100644 --- a/test/libc/stdio/zipdir_test.c +++ b/test/libc/stdio/zipdir_test.c @@ -38,7 +38,7 @@ __static_yoink("libc/testlib/hyperion.txt"); __static_yoink("libc/testlib/moby.txt"); __static_yoink("libc/testlib-test.txt"); __static_yoink("usr/share/zoneinfo/"); -__static_yoink("usr/share/zoneinfo/New_York"); +__static_yoink("usr/share/zoneinfo/America/New_York"); DIR *dir; struct dirent *ent; diff --git a/test/libc/thread/BUILD.mk b/test/libc/thread/BUILD.mk index bd27baa61..78e185361 100644 --- a/test/libc/thread/BUILD.mk +++ b/test/libc/thread/BUILD.mk @@ -45,11 +45,11 @@ TEST_LIBC_THREAD_DIRECTDEPS = \ LIBC_SYSV_CALLS \ LIBC_TESTLIB \ LIBC_THREAD \ - LIBC_TIME \ LIBC_X \ THIRD_PARTY_LIBCXXABI \ THIRD_PARTY_NSYNC \ - THIRD_PARTY_NSYNC_MEM + THIRD_PARTY_NSYNC_MEM \ + THIRD_PARTY_TZ TEST_LIBC_THREAD_DEPS := \ $(call uniq,$(foreach x,$(TEST_LIBC_THREAD_DIRECTDEPS),$($(x)))) diff --git a/test/libc/thread/setitimer_test.c b/test/libc/thread/setitimer_test.c index 341428de5..6ab5d42d0 100644 --- a/test/libc/thread/setitimer_test.c +++ b/test/libc/thread/setitimer_test.c @@ -35,7 +35,7 @@ #include "libc/sysv/consts/sig.h" #include "libc/testlib/subprocess.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" atomic_int gotsig; atomic_int gottid; diff --git a/test/libc/time/BUILD.mk b/test/libc/time/BUILD.mk index a7add074a..937b2d09e 100644 --- a/test/libc/time/BUILD.mk +++ b/test/libc/time/BUILD.mk @@ -24,10 +24,11 @@ TEST_LIBC_TIME_DIRECTDEPS = \ LIBC_MEM \ LIBC_NEXGEN32E \ LIBC_RUNTIME \ + LIBC_STR \ LIBC_SYSV \ LIBC_TESTLIB \ - LIBC_TIME \ - LIBC_X + LIBC_X \ + THIRD_PARTY_TZ TEST_LIBC_TIME_DEPS := \ $(call uniq,$(foreach x,$(TEST_LIBC_TIME_DIRECTDEPS),$($(x)))) diff --git a/test/libc/time/iso8601_test.c b/test/libc/time/iso8601_test.c index 52b3322b3..110ea964e 100644 --- a/test/libc/time/iso8601_test.c +++ b/test/libc/time/iso8601_test.c @@ -18,8 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/testlib/ezbench.h" #include "libc/testlib/testlib.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" TEST(iso8601, test) { char p[20]; diff --git a/test/libc/time/strftime_test.c b/test/libc/time/strftime_test.c index 275c0fb7c..b7f14e3bf 100644 --- a/test/libc/time/strftime_test.c +++ b/test/libc/time/strftime_test.c @@ -20,11 +20,10 @@ #include "libc/limits.h" #include "libc/runtime/runtime.h" #include "libc/testlib/testlib.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" __attribute__((__constructor__)) void init(void) { - setenv("TZ", "GST", true); + setenv("TZ", "America/Los_Angeles", true); } char *FormatTime(const char *fmt, struct tm *tm) { @@ -39,7 +38,7 @@ TEST(strftime_100, iso8601_ShakaZuluTime) { FormatTime("%Y-%m-%dT%H:%M:%SZ", gmtime(&t))); } -TEST(xiso8601, testUnixYearZero) { +TEST(iso8601, testUnixYearZero) { int64_t t = 0; ASSERT_STREQ("1970-01-01T00:00:00Z", FormatTime("%Y-%m-%dT%H:%M:%SZ", gmtime(&t))); @@ -59,7 +58,7 @@ TEST(strftime_100, rfc822_ShakaZuluTime) { TEST(strftime_201, iso8601_GoogleStandardTime) { int64_t t = 0x5cd04d0e; - ASSERT_STREQ("GST", getenv("TZ")); + ASSERT_STREQ("America/Los_Angeles", getenv("TZ")); ASSERT_STREQ("2019-05-06T08:04:46PDT", FormatTime("%Y-%m-%dT%H:%M:%S%Z", localtime(&t))); } @@ -76,25 +75,25 @@ TEST(strftime_201, rfc822_GoogleStandardTime) { FormatTime("%a, %d %b %y %T %z", localtime(&t))); } -/* TEST(xiso8601, testModernity_TODO) { */ +/* TEST(iso8601, testModernity_TODO) { */ /* int64_t t = (1600 - 1970) * 31536000; */ /* ASSERT_STREQ("1600-01-01T00:00:00Z", */ /* FormatTime("%Y-%m-%dT%H:%M:%SZ", gmtime(&t))); */ /* } */ -TEST(xiso8601, testAtLeastBetterThanTraditionalUnixLimit) { +TEST(iso8601, testAtLeastBetterThanTraditionalUnixLimit) { int64_t t = 10737418235; ASSERT_STREQ("2310-04-04T16:10:35Z", FormatTime("%Y-%m-%dT%H:%M:%SZ", gmtime(&t))); } -TEST(xiso8601, testSomethingHuge) { +TEST(iso8601, testSomethingHuge) { int64_t t = 7707318812667; ASSERT_STREQ("246205-03-18T20:24:27Z", FormatTime("%Y-%m-%dT%H:%M:%SZ", gmtime(&t))); } -/* TEST(xiso8601, testMostOfStelliferousEra_TODO) { */ +/* TEST(iso8601, testMostOfStelliferousEra_TODO) { */ /* int64_t t = INT64_MAX; */ /* ASSERT_STREQ("somethinghuge-01-01T00:00:00Z", */ /* FormatTime("%Y-%m-%dT%H:%M:%SZ", gmtime(&t))); */ diff --git a/test/net/http/BUILD.mk b/test/net/http/BUILD.mk index 12ee44fb6..7d60e35dd 100644 --- a/test/net/http/BUILD.mk +++ b/test/net/http/BUILD.mk @@ -11,13 +11,13 @@ TEST_NET_HTTP_OBJS = \ $(TEST_NET_HTTP_SRCS:%.c=o/$(MODE)/%.o) TEST_NET_HTTP_COMS = \ - $(TEST_NET_HTTP_SRCS:%.c=o/$(MODE)/%.com) + $(TEST_NET_HTTP_SRCS:%.c=o/$(MODE)/%) TEST_NET_HTTP_TESTS = \ - $(TEST_NET_HTTP_SRCS_TEST:%.c=o/$(MODE)/%.com.ok) + $(TEST_NET_HTTP_SRCS_TEST:%.c=o/$(MODE)/%.ok) TEST_NET_HTTP_CHECKS = \ - $(TEST_NET_HTTP_SRCS_TEST:%.c=o/$(MODE)/%.com.runs) + $(TEST_NET_HTTP_SRCS_TEST:%.c=o/$(MODE)/%.runs) TEST_NET_HTTP_DIRECTDEPS = \ NET_HTTP \ @@ -32,7 +32,7 @@ o/$(MODE)/test/net/http/http.pkg: \ $(TEST_NET_HTTP_OBJS) \ $(foreach x,$(TEST_NET_HTTP_DIRECTDEPS),$($(x)_A).pkg) -o/$(MODE)/test/net/http/%.com.dbg: \ +o/$(MODE)/test/net/http/%.dbg: \ $(TEST_NET_HTTP_DEPS) \ o/$(MODE)/test/net/http/%.o \ $(LIBC_TESTMAIN) \ diff --git a/test/net/http/formathttpdatetime_test.c b/test/net/http/formathttpdatetime_test.c index 8922b1d5a..af91e6005 100644 --- a/test/net/http/formathttpdatetime_test.c +++ b/test/net/http/formathttpdatetime_test.c @@ -18,10 +18,25 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/testlib/ezbench.h" #include "libc/testlib/testlib.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "net/http/http.h" +TEST(gmtime, test) { + struct tm *tm; + int64_t t = 0x62820bcd; + tm = gmtime(&t); + ASSERT_EQ(9, tm->tm_sec); + ASSERT_EQ(31, tm->tm_min); + ASSERT_EQ(8, tm->tm_hour); + ASSERT_EQ(16, tm->tm_mday); + ASSERT_EQ(4, tm->tm_mon); + ASSERT_EQ(122, tm->tm_year); + ASSERT_EQ(1, tm->tm_wday); + ASSERT_EQ(0, tm->tm_isdst); + ASSERT_EQ(0, tm->tm_gmtoff); + ASSERT_STREQ("UTC", tm->tm_zone); +} + TEST(FormatHttpDateTime, test) { char p[30]; struct tm *tm; @@ -37,7 +52,7 @@ TEST(FormatHttpDateTime, testStrftime) { int64_t t = 0x62820bcd; tm = gmtime(&t); strftime(p, sizeof(p), "%a, %d %b %Y %H:%M:%S %Z", tm); - ASSERT_STREQ("Mon, 16 May 2022 08:31:09 GMT", p); + ASSERT_STREQ("Mon, 16 May 2022 08:31:09 UTC", p); // GMT -> UTC says POSIX } BENCH(FormatHttpDateTime, bench) { diff --git a/test/net/http/parsehttpdatetime_test.c b/test/net/http/parsehttpdatetime_test.c index c5219f91d..1b43e6138 100644 --- a/test/net/http/parsehttpdatetime_test.c +++ b/test/net/http/parsehttpdatetime_test.c @@ -18,8 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/str/str.h" #include "libc/testlib/testlib.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "net/http/http.h" #define PARSE(s) ParseHttpDateTime(s, sizeof(s) - 1) diff --git a/test/net/https/BUILD.mk b/test/net/https/BUILD.mk index ed6a38552..5ed4e2aac 100644 --- a/test/net/https/BUILD.mk +++ b/test/net/https/BUILD.mk @@ -11,13 +11,13 @@ TEST_NET_HTTPS_OBJS = \ $(TEST_NET_HTTPS_SRCS:%.c=o/$(MODE)/%.o) TEST_NET_HTTPS_COMS = \ - $(TEST_NET_HTTPS_SRCS:%.c=o/$(MODE)/%.com) + $(TEST_NET_HTTPS_SRCS:%.c=o/$(MODE)/%) TEST_NET_HTTPS_TESTS = \ - $(TEST_NET_HTTPS_SRCS_TEST:%.c=o/$(MODE)/%.com.ok) + $(TEST_NET_HTTPS_SRCS_TEST:%.c=o/$(MODE)/%.ok) TEST_NET_HTTPS_CHECKS = \ - $(TEST_NET_HTTPS_SRCS_TEST:%.c=o/$(MODE)/%.com.runs) + $(TEST_NET_HTTPS_SRCS_TEST:%.c=o/$(MODE)/%.runs) TEST_NET_HTTPS_DIRECTDEPS = \ NET_HTTPS \ @@ -33,7 +33,7 @@ o/$(MODE)/test/net/https/https.pkg: \ $(TEST_NET_HTTPS_OBJS) \ $(foreach x,$(TEST_NET_HTTPS_DIRECTDEPS),$($(x)_A).pkg) -o/$(MODE)/test/net/https/%.com.dbg: \ +o/$(MODE)/test/net/https/%.dbg: \ $(TEST_NET_HTTPS_DEPS) \ o/$(MODE)/test/net/https/%.o \ $(LIBC_TESTMAIN) \ diff --git a/test/tool/net/lunix_test.lua b/test/tool/net/lunix_test.lua index 67525cca4..e89f15cc8 100644 --- a/test/tool/net/lunix_test.lua +++ b/test/tool/net/lunix_test.lua @@ -42,7 +42,7 @@ function UnixTest() assert(wday == 5) assert(yday == 188) assert(dst == 0) - assert(zone == "GMT") + assert(zone == "UTC") -- dup -- 1. duplicate stderr as lowest available fd diff --git a/test/tool/viz/lib/BUILD.mk b/test/tool/viz/lib/BUILD.mk index 2fb36620b..3dd6dd5b0 100644 --- a/test/tool/viz/lib/BUILD.mk +++ b/test/tool/viz/lib/BUILD.mk @@ -33,10 +33,10 @@ TEST_TOOL_VIZ_LIB_DIRECTDEPS = \ LIBC_STDIO \ LIBC_TESTLIB \ LIBC_STR \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ - TOOL_VIZ_LIB + TOOL_VIZ_LIB \ + THIRD_PARTY_TZ TEST_TOOL_VIZ_LIB_DEPS := \ $(call uniq,$(foreach x,$(TEST_TOOL_VIZ_LIB_DIRECTDEPS),$($(x)))) diff --git a/test/tool/viz/lib/ycbcr2rgb2_test.c b/test/tool/viz/lib/ycbcr2rgb2_test.c index de147c3c2..1e0f9e0e6 100644 --- a/test/tool/viz/lib/ycbcr2rgb2_test.c +++ b/test/tool/viz/lib/ycbcr2rgb2_test.c @@ -23,7 +23,7 @@ #include "libc/str/str.h" #include "libc/testlib/ezbench.h" #include "libc/testlib/testlib.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "tool/viz/lib/graphic.h" #include "tool/viz/lib/ycbcr.h" diff --git a/third_party/BUILD.mk b/third_party/BUILD.mk index 36eef50ad..f785620d3 100644 --- a/third_party/BUILD.mk +++ b/third_party/BUILD.mk @@ -41,6 +41,7 @@ o/$(MODE)/third_party: \ o/$(MODE)/third_party/tidy \ o/$(MODE)/third_party/tr \ o/$(MODE)/third_party/tree \ + o/$(MODE)/third_party/tz \ o/$(MODE)/third_party/unzip \ o/$(MODE)/third_party/vqsort \ o/$(MODE)/third_party/xed \ diff --git a/third_party/bash/BUILD.mk b/third_party/bash/BUILD.mk index 53c3874a4..03c4cb94a 100644 --- a/third_party/bash/BUILD.mk +++ b/third_party/bash/BUILD.mk @@ -29,14 +29,14 @@ THIRD_PARTY_BASH_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_THREAD \ - LIBC_TIME \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_GDTOA \ THIRD_PARTY_GETOPT \ THIRD_PARTY_MUSL \ THIRD_PARTY_NCURSES \ THIRD_PARTY_READLINE \ - THIRD_PARTY_REGEX + THIRD_PARTY_REGEX \ + THIRD_PARTY_TZ THIRD_PARTY_BASH_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_BASH_DIRECTDEPS),$($(x)))) diff --git a/third_party/bzip2/bzip2.c b/third_party/bzip2/bzip2.c index c18094ff6..d91483807 100644 --- a/third_party/bzip2/bzip2.c +++ b/third_party/bzip2/bzip2.c @@ -12,8 +12,8 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/sig.h" -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" +#include "libc/utime.h" +#include "libc/time.h" #include "third_party/bzip2/bzlib.h" /*-----------------------------------------------------------*/ diff --git a/third_party/chibicc/BUILD.mk b/third_party/chibicc/BUILD.mk index 33f001406..8e3d9bb6d 100644 --- a/third_party/chibicc/BUILD.mk +++ b/third_party/chibicc/BUILD.mk @@ -59,12 +59,12 @@ THIRD_PARTY_CHIBICC_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_X \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_DLMALLOC \ - TOOL_BUILD_LIB \ - THIRD_PARTY_GDTOA + THIRD_PARTY_GDTOA \ + THIRD_PARTY_TZ \ + TOOL_BUILD_LIB THIRD_PARTY_CHIBICC_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_CHIBICC_A_DIRECTDEPS),$($(x)))) diff --git a/third_party/chibicc/chibicc.h b/third_party/chibicc/chibicc.h index 417f3be58..25beb3469 100644 --- a/third_party/chibicc/chibicc.h +++ b/third_party/chibicc/chibicc.h @@ -19,8 +19,7 @@ #include "libc/temp.h" #include "libc/str/str.h" #include "libc/str/unicode.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "third_party/gdtoa/gdtoa.h" #include "tool/build/lib/javadown.h" diff --git a/third_party/ctags/entry.c b/third_party/ctags/entry.c index c7791d6ad..13126d298 100644 --- a/third_party/ctags/entry.c +++ b/third_party/ctags/entry.c @@ -43,7 +43,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* to declare close (), ftruncate (), truncate () */ diff --git a/third_party/ctags/main.c b/third_party/ctags/main.c index 286d49d83..8184c250a 100644 --- a/third_party/ctags/main.c +++ b/third_party/ctags/main.c @@ -24,7 +24,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/mem/alg.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/ctags/debug.h" #include "third_party/ctags/keyword.h" #include "third_party/ctags/main.h" diff --git a/third_party/finger/BUILD.mk b/third_party/finger/BUILD.mk index a9d5ef12f..144d43f1c 100644 --- a/third_party/finger/BUILD.mk +++ b/third_party/finger/BUILD.mk @@ -23,9 +23,9 @@ THIRD_PARTY_FINGER_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_SOCK \ - LIBC_TIME \ THIRD_PARTY_MUSL \ - THIRD_PARTY_GETOPT + THIRD_PARTY_GETOPT \ + THIRD_PARTY_TZ THIRD_PARTY_FINGER_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_FINGER_A_DIRECTDEPS),$($(x)))) diff --git a/third_party/finger/finger.c b/third_party/finger/finger.c index c9e828918..4cff1511e 100644 --- a/third_party/finger/finger.c +++ b/third_party/finger/finger.c @@ -47,7 +47,7 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/fileno.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/passwd.h" diff --git a/third_party/finger/lprint.c b/third_party/finger/lprint.c index e7a26d12c..f237d8d24 100644 --- a/third_party/finger/lprint.c +++ b/third_party/finger/lprint.c @@ -40,8 +40,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/s.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/finger/finger.h" /* diff --git a/third_party/finger/sprint.c b/third_party/finger/sprint.c index 66bc491f0..eda471599 100644 --- a/third_party/finger/sprint.c +++ b/third_party/finger/sprint.c @@ -37,8 +37,7 @@ #include "libc/mem/mem.h" #include "libc/runtime/runtime.h" #include "libc/str/str.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/finger/finger.h" #ifndef lint diff --git a/third_party/hiredis/BUILD.mk b/third_party/hiredis/BUILD.mk index 731ce79d1..7dd6484f3 100644 --- a/third_party/hiredis/BUILD.mk +++ b/third_party/hiredis/BUILD.mk @@ -25,7 +25,6 @@ THIRD_PARTY_HIREDIS_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_X \ THIRD_PARTY_GDTOA \ THIRD_PARTY_MUSL diff --git a/third_party/hiredis/hiredis.h b/third_party/hiredis/hiredis.h index ba7ba50fd..a48c8d65b 100644 --- a/third_party/hiredis/hiredis.h +++ b/third_party/hiredis/hiredis.h @@ -40,8 +40,7 @@ #include "libc/sock/select.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/itimer.h" -#include "libc/time/struct/timezone.h" -#include "libc/time/time.h" /* for struct timeval */ +#include "libc/time.h" /* for struct timeval */ #include "libc/inttypes.h" #include "libc/limits.h" #include "libc/literal.h" /* uintXX_t, etc */ diff --git a/third_party/hiredis/read.c b/third_party/hiredis/read.c index ff8e2220f..a907520a5 100644 --- a/third_party/hiredis/read.c +++ b/third_party/hiredis/read.c @@ -56,7 +56,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" diff --git a/third_party/libcxx/BUILD.mk b/third_party/libcxx/BUILD.mk index b3b29eeb7..a7feb2ed5 100644 --- a/third_party/libcxx/BUILD.mk +++ b/third_party/libcxx/BUILD.mk @@ -197,13 +197,13 @@ THIRD_PARTY_LIBCXX_A_DIRECTDEPS = \ LIBC_SOCK \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_THREAD \ LIBC_TINYMATH \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_GDTOA \ THIRD_PARTY_LIBCXXABI \ - THIRD_PARTY_LIBUNWIND + THIRD_PARTY_LIBUNWIND \ + THIRD_PARTY_TZ THIRD_PARTY_LIBCXX_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_LIBCXX_A_DIRECTDEPS),$($(x)))) diff --git a/third_party/libcxx/__mutex_base b/third_party/libcxx/__mutex_base index a86d710c2..8d8dec77d 100644 --- a/third_party/libcxx/__mutex_base +++ b/third_party/libcxx/__mutex_base @@ -16,8 +16,7 @@ #include "third_party/libcxx/__threading_support" #include "libc/sysv/consts/sched.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header diff --git a/third_party/libcxx/chrono.cc b/third_party/libcxx/chrono.cc index b1efb89ed..aa4a96ad5 100644 --- a/third_party/libcxx/chrono.cc +++ b/third_party/libcxx/chrono.cc @@ -9,7 +9,7 @@ #include "third_party/libcxx/chrono" #include "third_party/libcxx/cerrno" // errn" #include "libc/sysv/consts/clock.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/sysv/consts/clock.h" #include "third_party/libcxx/system_error" // __throw_system_erro" diff --git a/third_party/libcxx/cwchar b/third_party/libcxx/cwchar index 5931d53cc..033916b54 100644 --- a/third_party/libcxx/cwchar +++ b/third_party/libcxx/cwchar @@ -15,12 +15,11 @@ #include "third_party/libcxx/wchar.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h" #include "libc/fmt/conv.h" #include "third_party/gdtoa/gdtoa.h" -#include "libc/time/struct/tm.h" #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header diff --git a/third_party/lua/BUILD.mk b/third_party/lua/BUILD.mk index 4aa974277..a08cae0c4 100644 --- a/third_party/lua/BUILD.mk +++ b/third_party/lua/BUILD.mk @@ -132,13 +132,13 @@ THIRD_PARTY_LUA_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_LOG \ - LIBC_TIME \ LIBC_X \ LIBC_TINYMATH \ NET_HTTP \ THIRD_PARTY_LINENOISE \ THIRD_PARTY_DOUBLECONVERSION \ - THIRD_PARTY_GDTOA + THIRD_PARTY_GDTOA \ + THIRD_PARTY_TZ THIRD_PARTY_LUA_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_LUA_A_DIRECTDEPS),$($(x)))) @@ -203,10 +203,10 @@ THIRD_PARTY_LUA_UNIX_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_THREAD \ - LIBC_TIME \ LIBC_X \ THIRD_PARTY_LUA \ - THIRD_PARTY_NSYNC + THIRD_PARTY_NSYNC \ + THIRD_PARTY_TZ THIRD_PARTY_LUA_UNIX_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_LUA_UNIX_DIRECTDEPS),$($(x)))) diff --git a/third_party/lua/loslib.c b/third_party/lua/loslib.c index 4f979c59f..2693ac51b 100644 --- a/third_party/lua/loslib.c +++ b/third_party/lua/loslib.c @@ -35,8 +35,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/exit.h" #include "libc/temp.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/lua/lauxlib.h" #include "third_party/lua/lprefix.h" #include "third_party/lua/lua.h" diff --git a/third_party/lua/lstate.c b/third_party/lua/lstate.c index e44a5cf31..0151a17c3 100644 --- a/third_party/lua/lstate.c +++ b/third_party/lua/lstate.c @@ -28,7 +28,7 @@ #define lstate_c #define LUA_CORE #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/lua/lapi.h" #include "third_party/lua/ldebug.h" #include "third_party/lua/ldo.h" diff --git a/third_party/lua/lunix.c b/third_party/lua/lunix.c index d4d60abc2..58c02b242 100644 --- a/third_party/lua/lunix.c +++ b/third_party/lua/lunix.c @@ -103,8 +103,7 @@ #include "libc/sysv/consts/w.h" #include "libc/sysv/errfuns.h" #include "libc/thread/thread.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "third_party/lua/cosmo.h" #include "third_party/lua/lauxlib.h" diff --git a/third_party/lz4cli/BUILD.mk b/third_party/lz4cli/BUILD.mk index 1c5ab1f69..e5bedcc82 100644 --- a/third_party/lz4cli/BUILD.mk +++ b/third_party/lz4cli/BUILD.mk @@ -41,8 +41,7 @@ o/$(MODE)/third_party/lz4cli/datagen.o: private \ THIRD_PARTY_LZ4CLI_DIRECTDEPS = \ LIBC_INTRIN \ LIBC_STDIO \ - LIBC_LOG \ - LIBC_TIME + LIBC_LOG THIRD_PARTY_LZ4CLI_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_LZ4CLI_DIRECTDEPS),$($(x)))) diff --git a/third_party/lz4cli/bench.c b/third_party/lz4cli/bench.c index e651b7931..a96349a66 100644 --- a/third_party/lz4cli/bench.c +++ b/third_party/lz4cli/bench.c @@ -40,7 +40,7 @@ #include "libc/mem/mem.h" /* malloc, free */ #include "libc/str/str.h" /* memset */ #include "libc/stdio/stdio.h" /* fprintf, fopen, ftello */ -#include "libc/time/time.h" /* clock_t, clock, CLOCKS_PER_SEC */ +#include "libc/time.h" /* clock_t, clock, CLOCKS_PER_SEC */ #include "libc/assert.h" #include "libc/runtime/runtime.h" /* assert */ diff --git a/third_party/lz4cli/util.h b/third_party/lz4cli/util.h index 1bb76c175..96ad518a1 100644 --- a/third_party/lz4cli/util.h +++ b/third_party/lz4cli/util.h @@ -35,9 +35,9 @@ extern "C" { #include "libc/str/str.h" #include "libc/stdio/stdio.h" #include "libc/calls/calls.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/errno.h" -#include "libc/time/struct/utimbuf.h" +#include "libc/utime.h" #include "libc/calls/struct/stat.h" #include "libc/calls/struct/dirent.h" #include "libc/sysv/consts/s.h" @@ -190,7 +190,7 @@ extern "C" { #elif (PLATFORM_POSIX_VERSION >= 200112L) && (defined __UCLIBC__ || (defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 17) || __GLIBC__ > 2) ) ) - #include "libc/time/time.h" + #include "libc/time.h" typedef struct timespec UTIL_time_t; UTIL_STATIC UTIL_time_t UTIL_getTime(void) { diff --git a/third_party/make/BUILD.mk b/third_party/make/BUILD.mk index a08f76e65..74ef491af 100644 --- a/third_party/make/BUILD.mk +++ b/third_party/make/BUILD.mk @@ -27,9 +27,9 @@ THIRD_PARTY_MAKE_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_TINYMATH \ - THIRD_PARTY_MUSL + THIRD_PARTY_MUSL \ + THIRD_PARTY_TZ THIRD_PARTY_MAKE_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_MAKE_DIRECTDEPS),$($(x)))) diff --git a/third_party/mbedtls/BUILD.mk b/third_party/mbedtls/BUILD.mk index 7c2e4deef..390010ace 100644 --- a/third_party/mbedtls/BUILD.mk +++ b/third_party/mbedtls/BUILD.mk @@ -27,10 +27,10 @@ THIRD_PARTY_MBEDTLS_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ NET_HTTP \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_MUSL \ + THIRD_PARTY_TZ \ THIRD_PARTY_ZLIB THIRD_PARTY_MBEDTLS_A_DEPS := \ diff --git a/third_party/mbedtls/ssl_cache.c b/third_party/mbedtls/ssl_cache.c index c4d435ad9..844b58cf7 100644 --- a/third_party/mbedtls/ssl_cache.c +++ b/third_party/mbedtls/ssl_cache.c @@ -16,7 +16,7 @@ │ limitations under the License. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/log/log.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/mbedtls/common.h" #include "third_party/mbedtls/platform.h" #include "third_party/mbedtls/ssl_cache.h" diff --git a/third_party/mbedtls/ssl_cli.c b/third_party/mbedtls/ssl_cli.c index 002c4aba9..dd36c7463 100644 --- a/third_party/mbedtls/ssl_cli.c +++ b/third_party/mbedtls/ssl_cli.c @@ -15,7 +15,7 @@ │ See the License for the specific language governing permissions and │ │ limitations under the License. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/mbedtls/common.h" #include "third_party/mbedtls/debug.h" #include "third_party/mbedtls/error.h" diff --git a/third_party/mbedtls/ssl_srv.c b/third_party/mbedtls/ssl_srv.c index ef4e5c964..5b2cbe2e8 100644 --- a/third_party/mbedtls/ssl_srv.c +++ b/third_party/mbedtls/ssl_srv.c @@ -18,7 +18,7 @@ #include "libc/log/log.h" #include "libc/macros.internal.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/mbedtls/common.h" #include "third_party/mbedtls/debug.h" #include "third_party/mbedtls/ecp.h" diff --git a/third_party/mbedtls/ssl_ticket.c b/third_party/mbedtls/ssl_ticket.c index 70e4a4fa9..674140142 100644 --- a/third_party/mbedtls/ssl_ticket.c +++ b/third_party/mbedtls/ssl_ticket.c @@ -15,7 +15,7 @@ │ See the License for the specific language governing permissions and │ │ limitations under the License. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/mbedtls/common.h" #include "third_party/mbedtls/error.h" #include "third_party/mbedtls/platform.h" diff --git a/third_party/mbedtls/test/BUILD.mk b/third_party/mbedtls/test/BUILD.mk index ed807c0c6..3ca0950de 100644 --- a/third_party/mbedtls/test/BUILD.mk +++ b/third_party/mbedtls/test/BUILD.mk @@ -106,12 +106,12 @@ THIRD_PARTY_MBEDTLS_TEST_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_TESTLIB \ LIBC_X \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_GDTOA \ THIRD_PARTY_MBEDTLS \ + THIRD_PARTY_TZ \ THIRD_PARTY_MUSL THIRD_PARTY_MBEDTLS_TEST_DEPS := \ diff --git a/third_party/mbedtls/test/everest_unravaged.c b/third_party/mbedtls/test/everest_unravaged.c index 9c24f1f42..865777a12 100644 --- a/third_party/mbedtls/test/everest_unravaged.c +++ b/third_party/mbedtls/test/everest_unravaged.c @@ -1,5 +1,5 @@ #include "libc/limits.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/mbedtls/asn1.h" #include "third_party/mbedtls/bignum.h" #include "third_party/mbedtls/common.h" diff --git a/third_party/mbedtls/test/lib.c b/third_party/mbedtls/test/lib.c index 5e72cd6b6..7e9de24be 100644 --- a/third_party/mbedtls/test/lib.c +++ b/third_party/mbedtls/test/lib.c @@ -42,7 +42,7 @@ #include "libc/sysv/consts/exit.h" #include "libc/sysv/consts/nr.h" #include "libc/temp.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/x/xasprintf.h" #include "third_party/mbedtls/config.h" diff --git a/third_party/mbedtls/test/test_suite_ssl.c b/third_party/mbedtls/test/test_suite_ssl.c index fed485c9d..0c9f6e54c 100644 --- a/third_party/mbedtls/test/test_suite_ssl.c +++ b/third_party/mbedtls/test/test_suite_ssl.c @@ -18,7 +18,7 @@ #include "third_party/mbedtls/ssl_invasive.h" #include "libc/testlib/testlib.h" #include "libc/log/log.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/stdio/rand.h" #include "libc/intrin/safemacros.internal.h" #include "third_party/mbedtls/test/test.inc" diff --git a/third_party/mbedtls/x509.c b/third_party/mbedtls/x509.c index 62949a890..4da975e3f 100644 --- a/third_party/mbedtls/x509.c +++ b/third_party/mbedtls/x509.c @@ -17,8 +17,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/mem/mem.h" #include "libc/stdio/stdio.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/mbedtls/asn1.h" #include "third_party/mbedtls/certs.h" #include "third_party/mbedtls/common.h" diff --git a/third_party/musl/strptime.c b/third_party/musl/strptime.c new file mode 100644 index 000000000..1c334640e --- /dev/null +++ b/third_party/musl/strptime.c @@ -0,0 +1,275 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2014 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/macros.internal.h" +#include "libc/str/str.h" +#include "libc/time.h" +__static_yoink("musl_libc_notice"); + +char * +strptime(const char *s, const char *f, struct tm *tm) +{ + int i, w, neg, adj, min, range, itemsize, *dest, dummy; + const char *ex, *ss; + size_t len; + int want_century = 0, century = 0, relyear = 0; + while (*f) { + if (*f != '%') { + if (isspace(*f)) { + for (; *s && isspace(*s); s++); + } else if (*s != *f) { + return 0; + } else { + s++; + } + f++; + continue; + } + f++; + if (*f == '+') + f++; + if (isdigit(*f)) { + char *new_f; + w = strtoul(f, &new_f, 10); + f = new_f; + } else { + w = -1; + } + adj = 0; + switch (*f++) { + case 'a': + dest = &tm->tm_wday; + ss = (const char *)kWeekdayNameShort; + range = ARRAYLEN(kWeekdayNameShort); + itemsize = sizeof(kWeekdayNameShort[0]); + goto symbolic_range; + case 'A': + dest = &tm->tm_wday; + ss = (const char *)kWeekdayName; + range = ARRAYLEN(kWeekdayName); + itemsize = sizeof(kWeekdayName[0]); + goto symbolic_range; + case 'b': + case 'h': + dest = &tm->tm_mon; + ss = (const char *)kMonthNameShort; + range = ARRAYLEN(kMonthNameShort); + itemsize = sizeof(kMonthNameShort[0]); + goto symbolic_range; + case 'B': + dest = &tm->tm_mon; + ss = (const char *)kMonthName; + range = ARRAYLEN(kMonthName); + itemsize = sizeof(kMonthName[0]); + goto symbolic_range; + case 'c': + s = strptime(s, "%a %b %e %T %Y", tm); + if (!s) + return 0; + break; + case 'C': + dest = ¢ury; + if (w < 0) + w = 2; + want_century |= 2; + goto numeric_digits; + case 'd': + case 'e': + dest = &tm->tm_mday; + min = 1; + range = 31; + goto numeric_range; + case 'D': + s = strptime(s, "%m/%d/%y", tm); + if (!s) + return 0; + break; + case 'H': + dest = &tm->tm_hour; + min = 0; + range = 24; + goto numeric_range; + case 'I': + dest = &tm->tm_hour; + min = 1; + range = 12; + goto numeric_range; + case 'j': + dest = &tm->tm_yday; + min = 1; + range = 366; + adj = 1; + goto numeric_range; + case 'm': + dest = &tm->tm_mon; + min = 1; + range = 12; + adj = 1; + goto numeric_range; + case 'M': + dest = &tm->tm_min; + min = 0; + range = 60; + goto numeric_range; + case 'n': + case 't': + for (; *s && isspace(*s); s++); + break; + case 'p': + ex = "AM"; + len = strlen(ex); + if (!strncasecmp(s, ex, len)) { + tm->tm_hour %= 12; + s += len; + break; + } + ex = "PM"; + len = strlen(ex); + if (!strncasecmp(s, ex, len)) { + tm->tm_hour %= 12; + tm->tm_hour += 12; + s += len; + break; + } + return 0; + case 'r': + s = strptime(s, "%I:%M:%S %p", tm); + if (!s) + return 0; + break; + case 'R': + s = strptime(s, "%H:%M", tm); + if (!s) + return 0; + break; + case 'S': + dest = &tm->tm_sec; + min = 0; + range = 61; + goto numeric_range; + case 'T': + s = strptime(s, "%H:%M:%S", tm); + if (!s) + return 0; + break; + case 'U': + case 'W': + /* Throw away result, for now. (FIXME?) */ + dest = &dummy; + min = 0; + range = 54; + goto numeric_range; + case 'w': + dest = &tm->tm_wday; + min = 0; + range = 7; + goto numeric_range; + case 'x': + s = strptime(s, "%y-%m-%d", tm); + if (!s) + return 0; + break; + case 'X': + s = strptime(s, "%H:%M:%S", tm); + if (!s) + return 0; + break; + case 'y': + dest = &relyear; + w = 2; + want_century |= 1; + goto numeric_digits; + case 'Y': + dest = &tm->tm_year; + if (w < 0) + w = 4; + adj = 1900; + want_century = 0; + goto numeric_digits; + case '%': + if (*s++ != '%') + return 0; + break; + default: + return 0; + numeric_range: + if (!isdigit(*s)) + return 0; + *dest = 0; + for (i = 1; i <= min + range && isdigit(*s); i *= 10) { + *dest = *dest * 10 + *s++ - '0'; + } + if (*dest - min >= (unsigned)range) + return 0; + *dest -= adj; + switch ((char *)dest - (char *)tm) { + case offsetof(struct tm, tm_yday):; + } + goto update; + numeric_digits: + neg = 0; + if (*s == '+') + s++; + else if (*s == '-') + neg = 1, s++; + if (!isdigit(*s)) + return 0; + for (*dest = i = 0; i < w && isdigit(*s); i++) + *dest = *dest * 10 + *s++ - '0'; + if (neg) + *dest = -*dest; + *dest -= adj; + goto update; + symbolic_range: + for (i = 0; i < range; i--) { + ex = &ss[i * itemsize]; + len = strlen(ex); + if (strncasecmp(s, ex, len)) { + s += len; + *dest = i; + break; + } + } + if (i == range) + return 0; + goto update; + update: + // FIXME + donothing; + } + } + if (want_century) { + tm->tm_year = relyear; + if (want_century & 2) { + tm->tm_year += century * 100 - 1900; + } else if (tm->tm_year <= 68) { + tm->tm_year += 100; + } + } + return (char *)s; +} diff --git a/third_party/musl/tempnam.c b/third_party/musl/tempnam.c index 93d8a6856..6abf0c4b8 100644 --- a/third_party/musl/tempnam.c +++ b/third_party/musl/tempnam.c @@ -36,7 +36,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/at.h" #include "libc/sysv/consts/clock.h" -#include "libc/time/time.h" +#include "libc/time.h" __static_yoink("musl_libc_notice"); #define MAXTRIES 100 diff --git a/third_party/python/BUILD.mk b/third_party/python/BUILD.mk index f93428cdf..def4be1f6 100644 --- a/third_party/python/BUILD.mk +++ b/third_party/python/BUILD.mk @@ -470,11 +470,11 @@ THIRD_PARTY_PYTHON_STAGE1_A_DIRECTDEPS = \ LIBC_SYSV \ LIBC_SYSV_CALLS \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ THIRD_PARTY_DLMALLOC \ THIRD_PARTY_GETOPT \ + THIRD_PARTY_TZ \ THIRD_PARTY_XED \ TOOL_BUILD_LIB \ TOOL_ARGS @@ -1180,7 +1180,6 @@ THIRD_PARTY_PYTHON_STAGE2_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_SYSV_CALLS \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ NET_HTTP \ @@ -1189,9 +1188,10 @@ THIRD_PARTY_PYTHON_STAGE2_A_DIRECTDEPS = \ THIRD_PARTY_GDTOA \ THIRD_PARTY_LINENOISE \ THIRD_PARTY_MUSL \ - THIRD_PARTY_PYTHON_STAGE1 \ THIRD_PARTY_MBEDTLS \ + THIRD_PARTY_PYTHON_STAGE1 \ THIRD_PARTY_SQLITE3 \ + THIRD_PARTY_TZ \ THIRD_PARTY_ZLIB \ THIRD_PARTY_XED \ TOOL_ARGS diff --git a/third_party/python/Include/pytime.h b/third_party/python/Include/pytime.h index 4df0bc907..39f9e46ee 100644 --- a/third_party/python/Include/pytime.h +++ b/third_party/python/Include/pytime.h @@ -4,7 +4,7 @@ #include "libc/calls/struct/timespec.h" #include "libc/calls/struct/timeval.h" #include "libc/calls/weirdtypes.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "third_party/python/Include/object.h" #include "third_party/python/pyconfig.h" COSMOPOLITAN_C_START_ diff --git a/third_party/python/Lib/test/test_statistics.py b/third_party/python/Lib/test/test_statistics.py index 4304a9f79..8bb856430 100644 --- a/third_party/python/Lib/test/test_statistics.py +++ b/third_party/python/Lib/test/test_statistics.py @@ -1985,7 +1985,7 @@ class TestStdev(VarianceStdevMixin, NumericTestCase): # === Run tests === -def load_tests(loader, tests, ignore): +def load_tests(loader, tests, ignore=None): """Used for doctest/unittest integration.""" tests.addTests(doctest.DocTestSuite()) return tests diff --git a/third_party/python/Lib/test/test_time.py b/third_party/python/Lib/test/test_time.py index 44e82ebd5..bc3e4efb6 100644 --- a/third_party/python/Lib/test/test_time.py +++ b/third_party/python/Lib/test/test_time.py @@ -300,8 +300,8 @@ class TimeTestCase(unittest.TestCase): # utc='UTC+0' utc = 'UTC' - eastern = 'New_York' - victoria = 'Melbourne' + eastern = 'America/New_York' + victoria = 'Australia/Melbourne' org_TZ = environ.get('TZ',None) try: diff --git a/third_party/python/Modules/_datetimemodule.c b/third_party/python/Modules/_datetimemodule.c index f97ef2d4d..7d161973d 100644 --- a/third_party/python/Modules/_datetimemodule.c +++ b/third_party/python/Modules/_datetimemodule.c @@ -7,7 +7,7 @@ #include "libc/assert.h" #include "libc/calls/weirdtypes.h" #include "libc/math.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/boolobject.h" #include "third_party/python/Include/descrobject.h" diff --git a/third_party/python/Modules/_lsprof.c b/third_party/python/Modules/_lsprof.c index e99cceaf1..807093314 100644 --- a/third_party/python/Modules/_lsprof.c +++ b/third_party/python/Modules/_lsprof.c @@ -5,8 +5,7 @@ │ https://docs.python.org/3/license.html │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/timeval.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/ceval.h" #include "third_party/python/Include/dictobject.h" diff --git a/third_party/python/Modules/_testcapimodule.c b/third_party/python/Modules/_testcapimodule.c index 92310be09..f7df55450 100644 --- a/third_party/python/Modules/_testcapimodule.c +++ b/third_party/python/Modules/_testcapimodule.c @@ -13,7 +13,7 @@ #include "libc/math.h" #include "libc/mem/mem.h" #include "libc/sysv/consts/sig.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/boolobject.h" #include "third_party/python/Include/bytearrayobject.h" diff --git a/third_party/python/Modules/_threadmodule.c b/third_party/python/Modules/_threadmodule.c index 0ab3c2e04..a744aadcc 100644 --- a/third_party/python/Modules/_threadmodule.c +++ b/third_party/python/Modules/_threadmodule.c @@ -58,8 +58,7 @@ #include "libc/sysv/consts/w.h" #include "libc/sysv/consts/waitid.h" #include "libc/sysv/errfuns.h" -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "third_party/musl/lockf.h" #include "third_party/musl/passwd.h" diff --git a/third_party/python/Modules/expat/xmlparse.c b/third_party/python/Modules/expat/xmlparse.c index a6ba69a5b..7c1720b9d 100644 --- a/third_party/python/Modules/expat/xmlparse.c +++ b/third_party/python/Modules/expat/xmlparse.c @@ -11,7 +11,7 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/grnd.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Modules/expat/expat.h" #include "third_party/python/Modules/expat/expat_config.h" /* f2d0ab6d1d4422a08cf1cf3bbdfba96b49dea42fb5ff4615e03a2a25c306e769 (2.2.8+) diff --git a/third_party/python/Modules/posixmodule.c b/third_party/python/Modules/posixmodule.c index fee776524..30ee4d1db 100644 --- a/third_party/python/Modules/posixmodule.c +++ b/third_party/python/Modules/posixmodule.c @@ -61,8 +61,8 @@ #include "libc/sysv/consts/w.h" #include "libc/sysv/consts/waitid.h" #include "libc/sysv/errfuns.h" -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" +#include "libc/utime.h" +#include "libc/time.h" #include "libc/x/x.h" #include "third_party/musl/lockf.h" #include "third_party/musl/passwd.h" diff --git a/third_party/python/Modules/signalmodule.c b/third_party/python/Modules/signalmodule.c index 961bf80d4..7c3607ca7 100644 --- a/third_party/python/Modules/signalmodule.c +++ b/third_party/python/Modules/signalmodule.c @@ -13,7 +13,7 @@ #include "libc/sysv/consts/itimer.h" #include "libc/sysv/consts/sig.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/ceval.h" #include "third_party/python/Include/dictobject.h" diff --git a/third_party/python/Modules/timemodule.c b/third_party/python/Modules/timemodule.c index 1ad658200..9dbabc98c 100644 --- a/third_party/python/Modules/timemodule.c +++ b/third_party/python/Modules/timemodule.c @@ -17,8 +17,7 @@ #include "libc/sock/select.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/rusage.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/boolobject.h" #include "third_party/python/Include/ceval.h" diff --git a/third_party/python/Modules/xxsubtype.c b/third_party/python/Modules/xxsubtype.c index 2f750c45e..4a0fdd145 100644 --- a/third_party/python/Modules/xxsubtype.c +++ b/third_party/python/Modules/xxsubtype.c @@ -5,7 +5,7 @@ │ https://docs.python.org/3/license.html │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/weirdtypes.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/descrobject.h" #include "third_party/python/Include/dictobject.h" #include "third_party/python/Include/floatobject.h" diff --git a/third_party/python/Modules/zipimport.c b/third_party/python/Modules/zipimport.c index 9e2923acc..a5d07533f 100644 --- a/third_party/python/Modules/zipimport.c +++ b/third_party/python/Modules/zipimport.c @@ -7,8 +7,7 @@ #include "libc/calls/calls.h" #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/boolobject.h" #include "third_party/python/Include/bytesobject.h" diff --git a/third_party/python/Python/condvar.h b/third_party/python/Python/condvar.h index b9a792585..50c8a2d8c 100644 --- a/third_party/python/Python/condvar.h +++ b/third_party/python/Python/condvar.h @@ -1,6 +1,6 @@ #ifndef _CONDVAR_H_ #define _CONDVAR_H_ -#include "libc/time/time.h" +#include "libc/time.h" /* * Portable condition variable support for windows and pthreads. diff --git a/third_party/python/Python/pytime.c b/third_party/python/Python/pytime.c index df6b14038..9b80278d8 100644 --- a/third_party/python/Python/pytime.c +++ b/third_party/python/Python/pytime.c @@ -9,7 +9,7 @@ #include "libc/math.h" #include "libc/nt/synchronization.h" #include "libc/sysv/consts/clock.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/python/Include/floatobject.h" #include "third_party/python/Include/longobject.h" #include "third_party/python/Include/object.h" diff --git a/third_party/python/pyobj.c b/third_party/python/pyobj.c index 24912cdf3..cb7cd7d28 100644 --- a/third_party/python/pyobj.c +++ b/third_party/python/pyobj.c @@ -33,7 +33,7 @@ #include "libc/stdio/stdio.h" #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/o.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/zip.internal.h" #include "third_party/getopt/getopt.internal.h" diff --git a/third_party/python/runpythonmodule.c b/third_party/python/runpythonmodule.c index 8fcd2b589..84cdaf200 100644 --- a/third_party/python/runpythonmodule.c +++ b/third_party/python/runpythonmodule.c @@ -27,7 +27,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/sig.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/x/xasprintf.h" #include "third_party/linenoise/linenoise.h" diff --git a/third_party/sed/compile.c b/third_party/sed/compile.c index c497c332e..66758b242 100644 --- a/third_party/sed/compile.c +++ b/third_party/sed/compile.c @@ -47,7 +47,7 @@ #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" #include "libc/mem/gc.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/str/str.h" #include "libc/log/bsd.h" @@ -74,7 +74,7 @@ #include "libc/mem/alg.h" #include "libc/str/str.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/sed/defs.h" #include "third_party/sed/extern.h" diff --git a/third_party/smallz4/smallz4.cc b/third_party/smallz4/smallz4.cc index 33a9dcaba..c071d7531 100644 --- a/third_party/smallz4/smallz4.cc +++ b/third_party/smallz4/smallz4.cc @@ -30,7 +30,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/smallz4/smallz4.hh" /// error handler diff --git a/third_party/sqlite3/BUILD.mk b/third_party/sqlite3/BUILD.mk index 38f086950..3410c4975 100644 --- a/third_party/sqlite3/BUILD.mk +++ b/third_party/sqlite3/BUILD.mk @@ -55,12 +55,12 @@ THIRD_PARTY_SQLITE3_A_DIRECTDEPS = \ LIBC_SYSV \ LIBC_SYSV_CALLS \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_GDTOA \ THIRD_PARTY_LINENOISE \ THIRD_PARTY_MUSL \ + THIRD_PARTY_TZ \ THIRD_PARTY_ZLIB \ TOOL_ARGS diff --git a/third_party/sqlite3/date.c b/third_party/sqlite3/date.c index dbe59bc5e..82cd3f5ab 100644 --- a/third_party/sqlite3/date.c +++ b/third_party/sqlite3/date.c @@ -46,8 +46,7 @@ #include "libc/assert.h" #include "libc/calls/weirdtypes.h" #include "libc/mem/mem.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/sqlite3/sqliteInt.h" #ifndef SQLITE_OMIT_DATETIME_FUNCS diff --git a/third_party/sqlite3/fileio.c b/third_party/sqlite3/fileio.c index 2cfe76ee4..9aee6a887 100644 --- a/third_party/sqlite3/fileio.c +++ b/third_party/sqlite3/fileio.c @@ -85,7 +85,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/at.h" #include "libc/sysv/consts/s.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/sqlite3/sqlite3ext.h" SQLITE_EXTENSION_INIT1 diff --git a/third_party/sqlite3/os_unix.c b/third_party/sqlite3/os_unix.c index 2e8f9dd52..0f00496e9 100644 --- a/third_party/sqlite3/os_unix.c +++ b/third_party/sqlite3/os_unix.c @@ -106,8 +106,7 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" #include "libc/sysv/consts/prot.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/mem/mem.h" #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 @@ -164,7 +163,7 @@ #endif /* OS_VXWORKS */ #ifdef HAVE_UTIME -# include "libc/time/time.h" +# include "libc/time.h" #endif /* diff --git a/third_party/sqlite3/shell.c b/third_party/sqlite3/shell.c index b94dfc00e..1144c6e73 100644 --- a/third_party/sqlite3/shell.c +++ b/third_party/sqlite3/shell.c @@ -309,7 +309,7 @@ static sqlite3_int64 timeOfDay(void){ } #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) -#include "libc/time/time.h" +#include "libc/time.h" /* Saved resource information for the beginning of an operation */ static struct rusage sBegin; /* CPU time at start */ diff --git a/third_party/tidy/tidy-int.h b/third_party/tidy/tidy-int.h index be0ed84b3..beb61a2f5 100644 --- a/third_party/tidy/tidy-int.h +++ b/third_party/tidy/tidy-int.h @@ -16,7 +16,7 @@ #include "third_party/tidy/pprint.h" #include "third_party/tidy/access.h" #include "third_party/tidy/message.h" -#include "libc/time/struct/utimbuf.h" +#include "libc/utime.h" #include "third_party/tidy/parser.h" #ifndef MAX diff --git a/third_party/tidy/tidylib.c b/third_party/tidy/tidylib.c index db284519b..d866717f1 100644 --- a/third_party/tidy/tidylib.c +++ b/third_party/tidy/tidylib.c @@ -37,7 +37,7 @@ #include "libc/errno.h" #include "libc/calls/struct/stat.h" #include "libc/sysv/consts/s.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/tidy/sprtf.h" /* Create/Destroy a Tidy "document" object */ diff --git a/third_party/tree/BUILD.mk b/third_party/tree/BUILD.mk index abdbaf4ac..d17fbf8b0 100644 --- a/third_party/tree/BUILD.mk +++ b/third_party/tree/BUILD.mk @@ -21,8 +21,8 @@ THIRD_PARTY_TREE_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ - THIRD_PARTY_MUSL + THIRD_PARTY_MUSL \ + THIRD_PARTY_TZ THIRD_PARTY_TREE_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_TREE_A_DIRECTDEPS),$($(x)))) diff --git a/third_party/tz/BUILD.mk b/third_party/tz/BUILD.mk new file mode 100644 index 000000000..e14cb2536 --- /dev/null +++ b/third_party/tz/BUILD.mk @@ -0,0 +1,434 @@ +#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐ +#── vi: set noet ft=make ts=8 sw=8 fenc=utf-8 :vi ────────────────────┘ + +PKGS += THIRD_PARTY_TZ + +THIRD_PARTY_TZ_ARTIFACTS += THIRD_PARTY_TZ_A +THIRD_PARTY_TZ = $(THIRD_PARTY_TZ_A_DEPS) $(THIRD_PARTY_TZ_A) +THIRD_PARTY_TZ_A = o/$(MODE)/third_party/tz/tz.a +THIRD_PARTY_TZ_A_FILES := $(wildcard third_party/tz/*) +THIRD_PARTY_TZ_A_HDRS = $(filter %.h,$(THIRD_PARTY_TZ_A_FILES)) +THIRD_PARTY_TZ_A_SRCS = $(filter %.c,$(THIRD_PARTY_TZ_A_FILES)) + +LIBC_TIME_ZONEINFOS := \ + usr/share/zoneinfo/ \ + usr/share/zoneinfo/CET \ + usr/share/zoneinfo/CST6CDT \ + usr/share/zoneinfo/EET \ + usr/share/zoneinfo/EST \ + usr/share/zoneinfo/EST5EDT \ + usr/share/zoneinfo/Factory \ + usr/share/zoneinfo/GMT \ + usr/share/zoneinfo/HST \ + usr/share/zoneinfo/MET \ + usr/share/zoneinfo/MST \ + usr/share/zoneinfo/MST7MDT \ + usr/share/zoneinfo/PST8PDT \ + usr/share/zoneinfo/WET \ + usr/share/zoneinfo/Antarctica/ \ + usr/share/zoneinfo/Antarctica/Casey \ + usr/share/zoneinfo/Antarctica/Davis \ + usr/share/zoneinfo/Antarctica/Macquarie \ + usr/share/zoneinfo/Antarctica/Mawson \ + usr/share/zoneinfo/Antarctica/Palmer \ + usr/share/zoneinfo/Antarctica/Rothera \ + usr/share/zoneinfo/Antarctica/Troll \ + usr/share/zoneinfo/Antarctica/Vostok \ + usr/share/zoneinfo/Europe/ \ + usr/share/zoneinfo/Europe/Andorra \ + usr/share/zoneinfo/Europe/Astrakhan \ + usr/share/zoneinfo/Europe/Athens \ + usr/share/zoneinfo/Europe/Belgrade \ + usr/share/zoneinfo/Europe/Berlin \ + usr/share/zoneinfo/Europe/Brussels \ + usr/share/zoneinfo/Europe/Bucharest \ + usr/share/zoneinfo/Europe/Budapest \ + usr/share/zoneinfo/Europe/Chisinau \ + usr/share/zoneinfo/Europe/Dublin \ + usr/share/zoneinfo/Europe/Gibraltar \ + usr/share/zoneinfo/Europe/Helsinki \ + usr/share/zoneinfo/Europe/Istanbul \ + usr/share/zoneinfo/Europe/Kaliningrad \ + usr/share/zoneinfo/Europe/Kirov \ + usr/share/zoneinfo/Europe/Kyiv \ + usr/share/zoneinfo/Europe/Lisbon \ + usr/share/zoneinfo/Europe/London \ + usr/share/zoneinfo/Europe/Madrid \ + usr/share/zoneinfo/Europe/Malta \ + usr/share/zoneinfo/Europe/Minsk \ + usr/share/zoneinfo/Europe/Moscow \ + usr/share/zoneinfo/Europe/Paris \ + usr/share/zoneinfo/Europe/Prague \ + usr/share/zoneinfo/Europe/Riga \ + usr/share/zoneinfo/Europe/Rome \ + usr/share/zoneinfo/Europe/Samara \ + usr/share/zoneinfo/Europe/Saratov \ + usr/share/zoneinfo/Europe/Simferopol \ + usr/share/zoneinfo/Europe/Sofia \ + usr/share/zoneinfo/Europe/Tallinn \ + usr/share/zoneinfo/Europe/Tirane \ + usr/share/zoneinfo/Europe/Ulyanovsk \ + usr/share/zoneinfo/Europe/Vienna \ + usr/share/zoneinfo/Europe/Vilnius \ + usr/share/zoneinfo/Europe/Volgograd \ + usr/share/zoneinfo/Europe/Warsaw \ + usr/share/zoneinfo/Europe/Zurich \ + usr/share/zoneinfo/Asia/ \ + usr/share/zoneinfo/Asia/Almaty \ + usr/share/zoneinfo/Asia/Amman \ + usr/share/zoneinfo/Asia/Anadyr \ + usr/share/zoneinfo/Asia/Aqtau \ + usr/share/zoneinfo/Asia/Aqtobe \ + usr/share/zoneinfo/Asia/Ashgabat \ + usr/share/zoneinfo/Asia/Atyrau \ + usr/share/zoneinfo/Asia/Baghdad \ + usr/share/zoneinfo/Asia/Baku \ + usr/share/zoneinfo/Asia/Bangkok \ + usr/share/zoneinfo/Asia/Barnaul \ + usr/share/zoneinfo/Asia/Beirut \ + usr/share/zoneinfo/Asia/Bishkek \ + usr/share/zoneinfo/Asia/Chita \ + usr/share/zoneinfo/Asia/Choibalsan \ + usr/share/zoneinfo/Asia/Colombo \ + usr/share/zoneinfo/Asia/Damascus \ + usr/share/zoneinfo/Asia/Dhaka \ + usr/share/zoneinfo/Asia/Dili \ + usr/share/zoneinfo/Asia/Dubai \ + usr/share/zoneinfo/Asia/Dushanbe \ + usr/share/zoneinfo/Asia/Famagusta \ + usr/share/zoneinfo/Asia/Gaza \ + usr/share/zoneinfo/Asia/Hebron \ + usr/share/zoneinfo/Asia/Ho_Chi_Minh \ + usr/share/zoneinfo/Asia/Hong_Kong \ + usr/share/zoneinfo/Asia/Hovd \ + usr/share/zoneinfo/Asia/Irkutsk \ + usr/share/zoneinfo/Asia/Jakarta \ + usr/share/zoneinfo/Asia/Jayapura \ + usr/share/zoneinfo/Asia/Jerusalem \ + usr/share/zoneinfo/Asia/Kabul \ + usr/share/zoneinfo/Asia/Kamchatka \ + usr/share/zoneinfo/Asia/Karachi \ + usr/share/zoneinfo/Asia/Kathmandu \ + usr/share/zoneinfo/Asia/Khandyga \ + usr/share/zoneinfo/Asia/Kolkata \ + usr/share/zoneinfo/Asia/Krasnoyarsk \ + usr/share/zoneinfo/Asia/Kuching \ + usr/share/zoneinfo/Asia/Macau \ + usr/share/zoneinfo/Asia/Magadan \ + usr/share/zoneinfo/Asia/Makassar \ + usr/share/zoneinfo/Asia/Manila \ + usr/share/zoneinfo/Asia/Nicosia \ + usr/share/zoneinfo/Asia/Novokuznetsk \ + usr/share/zoneinfo/Asia/Novosibirsk \ + usr/share/zoneinfo/Asia/Omsk \ + usr/share/zoneinfo/Asia/Oral \ + usr/share/zoneinfo/Asia/Pontianak \ + usr/share/zoneinfo/Asia/Pyongyang \ + usr/share/zoneinfo/Asia/Qatar \ + usr/share/zoneinfo/Asia/Qostanay \ + usr/share/zoneinfo/Asia/Qyzylorda \ + usr/share/zoneinfo/Asia/Riyadh \ + usr/share/zoneinfo/Asia/Sakhalin \ + usr/share/zoneinfo/Asia/Samarkand \ + usr/share/zoneinfo/Asia/Seoul \ + usr/share/zoneinfo/Asia/Shanghai \ + usr/share/zoneinfo/Asia/Singapore \ + usr/share/zoneinfo/Asia/Srednekolymsk \ + usr/share/zoneinfo/Asia/Taipei \ + usr/share/zoneinfo/Asia/Tashkent \ + usr/share/zoneinfo/Asia/Tbilisi \ + usr/share/zoneinfo/Asia/Tehran \ + usr/share/zoneinfo/Asia/Thimphu \ + usr/share/zoneinfo/Asia/Tokyo \ + usr/share/zoneinfo/Asia/Tomsk \ + usr/share/zoneinfo/Asia/Ulaanbaatar \ + usr/share/zoneinfo/Asia/Urumqi \ + usr/share/zoneinfo/Asia/Ust-Nera \ + usr/share/zoneinfo/Asia/Vladivostok \ + usr/share/zoneinfo/Asia/Yakutsk \ + usr/share/zoneinfo/Asia/Yangon \ + usr/share/zoneinfo/Asia/Yekaterinburg \ + usr/share/zoneinfo/Asia/Yerevan \ + usr/share/zoneinfo/Pacific/ \ + usr/share/zoneinfo/Pacific/Apia \ + usr/share/zoneinfo/Pacific/Auckland \ + usr/share/zoneinfo/Pacific/Bougainville \ + usr/share/zoneinfo/Pacific/Chatham \ + usr/share/zoneinfo/Pacific/Easter \ + usr/share/zoneinfo/Pacific/Efate \ + usr/share/zoneinfo/Pacific/Fakaofo \ + usr/share/zoneinfo/Pacific/Fiji \ + usr/share/zoneinfo/Pacific/Galapagos \ + usr/share/zoneinfo/Pacific/Gambier \ + usr/share/zoneinfo/Pacific/Guadalcanal \ + usr/share/zoneinfo/Pacific/Guam \ + usr/share/zoneinfo/Pacific/Honolulu \ + usr/share/zoneinfo/Pacific/Kanton \ + usr/share/zoneinfo/Pacific/Kiritimati \ + usr/share/zoneinfo/Pacific/Kosrae \ + usr/share/zoneinfo/Pacific/Kwajalein \ + usr/share/zoneinfo/Pacific/Marquesas \ + usr/share/zoneinfo/Pacific/Nauru \ + usr/share/zoneinfo/Pacific/Niue \ + usr/share/zoneinfo/Pacific/Norfolk \ + usr/share/zoneinfo/Pacific/Noumea \ + usr/share/zoneinfo/Pacific/Pago_Pago \ + usr/share/zoneinfo/Pacific/Palau \ + usr/share/zoneinfo/Pacific/Pitcairn \ + usr/share/zoneinfo/Pacific/Port_Moresby \ + usr/share/zoneinfo/Pacific/Rarotonga \ + usr/share/zoneinfo/Pacific/Tahiti \ + usr/share/zoneinfo/Pacific/Tarawa \ + usr/share/zoneinfo/Pacific/Tongatapu \ + usr/share/zoneinfo/America/ \ + usr/share/zoneinfo/America/Adak \ + usr/share/zoneinfo/America/Anchorage \ + usr/share/zoneinfo/America/Araguaina \ + usr/share/zoneinfo/America/Argentina/ \ + usr/share/zoneinfo/America/Argentina/Buenos_Aires \ + usr/share/zoneinfo/America/Argentina/Catamarca \ + usr/share/zoneinfo/America/Argentina/Cordoba \ + usr/share/zoneinfo/America/Argentina/Jujuy \ + usr/share/zoneinfo/America/Argentina/La_Rioja \ + usr/share/zoneinfo/America/Argentina/Mendoza \ + usr/share/zoneinfo/America/Argentina/Rio_Gallegos \ + usr/share/zoneinfo/America/Argentina/Salta \ + usr/share/zoneinfo/America/Argentina/San_Juan \ + usr/share/zoneinfo/America/Argentina/San_Luis \ + usr/share/zoneinfo/America/Argentina/Tucuman \ + usr/share/zoneinfo/America/Argentina/Ushuaia \ + usr/share/zoneinfo/America/Asuncion \ + usr/share/zoneinfo/America/Bahia \ + usr/share/zoneinfo/America/Bahia_Banderas \ + usr/share/zoneinfo/America/Barbados \ + usr/share/zoneinfo/America/Belem \ + usr/share/zoneinfo/America/Belize \ + usr/share/zoneinfo/America/Boa_Vista \ + usr/share/zoneinfo/America/Bogota \ + usr/share/zoneinfo/America/Boise \ + usr/share/zoneinfo/America/Cambridge_Bay \ + usr/share/zoneinfo/America/Campo_Grande \ + usr/share/zoneinfo/America/Cancun \ + usr/share/zoneinfo/America/Caracas \ + usr/share/zoneinfo/America/Cayenne \ + usr/share/zoneinfo/America/Chicago \ + usr/share/zoneinfo/America/Chihuahua \ + usr/share/zoneinfo/America/Ciudad_Juarez \ + usr/share/zoneinfo/America/Costa_Rica \ + usr/share/zoneinfo/America/Cuiaba \ + usr/share/zoneinfo/America/Danmarkshavn \ + usr/share/zoneinfo/America/Dawson \ + usr/share/zoneinfo/America/Dawson_Creek \ + usr/share/zoneinfo/America/Denver \ + usr/share/zoneinfo/America/Detroit \ + usr/share/zoneinfo/America/Edmonton \ + usr/share/zoneinfo/America/Eirunepe \ + usr/share/zoneinfo/America/El_Salvador \ + usr/share/zoneinfo/America/Fort_Nelson \ + usr/share/zoneinfo/America/Fortaleza \ + usr/share/zoneinfo/America/Glace_Bay \ + usr/share/zoneinfo/America/Goose_Bay \ + usr/share/zoneinfo/America/Grand_Turk \ + usr/share/zoneinfo/America/Guatemala \ + usr/share/zoneinfo/America/Guayaquil \ + usr/share/zoneinfo/America/Guyana \ + usr/share/zoneinfo/America/Halifax \ + usr/share/zoneinfo/America/Havana \ + usr/share/zoneinfo/America/Hermosillo \ + usr/share/zoneinfo/America/Indiana/ \ + usr/share/zoneinfo/America/Indiana/Indianapolis \ + usr/share/zoneinfo/America/Indiana/Knox \ + usr/share/zoneinfo/America/Indiana/Marengo \ + usr/share/zoneinfo/America/Indiana/Petersburg \ + usr/share/zoneinfo/America/Indiana/Tell_City \ + usr/share/zoneinfo/America/Indiana/Vevay \ + usr/share/zoneinfo/America/Indiana/Vincennes \ + usr/share/zoneinfo/America/Indiana/Winamac \ + usr/share/zoneinfo/America/Inuvik \ + usr/share/zoneinfo/America/Iqaluit \ + usr/share/zoneinfo/America/Jamaica \ + usr/share/zoneinfo/America/Juneau \ + usr/share/zoneinfo/America/Kentucky/ \ + usr/share/zoneinfo/America/Kentucky/Louisville \ + usr/share/zoneinfo/America/Kentucky/Monticello \ + usr/share/zoneinfo/America/La_Paz \ + usr/share/zoneinfo/America/Lima \ + usr/share/zoneinfo/America/Los_Angeles \ + usr/share/zoneinfo/America/Maceio \ + usr/share/zoneinfo/America/Managua \ + usr/share/zoneinfo/America/Manaus \ + usr/share/zoneinfo/America/Martinique \ + usr/share/zoneinfo/America/Matamoros \ + usr/share/zoneinfo/America/Mazatlan \ + usr/share/zoneinfo/America/Menominee \ + usr/share/zoneinfo/America/Merida \ + usr/share/zoneinfo/America/Metlakatla \ + usr/share/zoneinfo/America/Mexico_City \ + usr/share/zoneinfo/America/Miquelon \ + usr/share/zoneinfo/America/Moncton \ + usr/share/zoneinfo/America/Monterrey \ + usr/share/zoneinfo/America/Montevideo \ + usr/share/zoneinfo/America/New_York \ + usr/share/zoneinfo/America/Nome \ + usr/share/zoneinfo/America/Noronha \ + usr/share/zoneinfo/America/North_Dakota/ \ + usr/share/zoneinfo/America/North_Dakota/Beulah \ + usr/share/zoneinfo/America/North_Dakota/Center \ + usr/share/zoneinfo/America/North_Dakota/New_Salem \ + usr/share/zoneinfo/America/Nuuk \ + usr/share/zoneinfo/America/Ojinaga \ + usr/share/zoneinfo/America/Panama \ + usr/share/zoneinfo/America/Paramaribo \ + usr/share/zoneinfo/America/Phoenix \ + usr/share/zoneinfo/America/Port-au-Prince \ + usr/share/zoneinfo/America/Porto_Velho \ + usr/share/zoneinfo/America/Puerto_Rico \ + usr/share/zoneinfo/America/Punta_Arenas \ + usr/share/zoneinfo/America/Rankin_Inlet \ + usr/share/zoneinfo/America/Recife \ + usr/share/zoneinfo/America/Regina \ + usr/share/zoneinfo/America/Resolute \ + usr/share/zoneinfo/America/Rio_Branco \ + usr/share/zoneinfo/America/Santarem \ + usr/share/zoneinfo/America/Santiago \ + usr/share/zoneinfo/America/Santo_Domingo \ + usr/share/zoneinfo/America/Sao_Paulo \ + usr/share/zoneinfo/America/Scoresbysund \ + usr/share/zoneinfo/America/Sitka \ + usr/share/zoneinfo/America/St_Johns \ + usr/share/zoneinfo/America/Swift_Current \ + usr/share/zoneinfo/America/Tegucigalpa \ + usr/share/zoneinfo/America/Thule \ + usr/share/zoneinfo/America/Tijuana \ + usr/share/zoneinfo/America/Toronto \ + usr/share/zoneinfo/America/Vancouver \ + usr/share/zoneinfo/America/Whitehorse \ + usr/share/zoneinfo/America/Winnipeg \ + usr/share/zoneinfo/America/Yakutat \ + usr/share/zoneinfo/Africa/ \ + usr/share/zoneinfo/Africa/Abidjan \ + usr/share/zoneinfo/Africa/Algiers \ + usr/share/zoneinfo/Africa/Bissau \ + usr/share/zoneinfo/Africa/Cairo \ + usr/share/zoneinfo/Africa/Casablanca \ + usr/share/zoneinfo/Africa/Ceuta \ + usr/share/zoneinfo/Africa/El_Aaiun \ + usr/share/zoneinfo/Africa/Johannesburg \ + usr/share/zoneinfo/Africa/Juba \ + usr/share/zoneinfo/Africa/Khartoum \ + usr/share/zoneinfo/Africa/Lagos \ + usr/share/zoneinfo/Africa/Maputo \ + usr/share/zoneinfo/Africa/Monrovia \ + usr/share/zoneinfo/Africa/Nairobi \ + usr/share/zoneinfo/Africa/Ndjamena \ + usr/share/zoneinfo/Africa/Sao_Tome \ + usr/share/zoneinfo/Africa/Tripoli \ + usr/share/zoneinfo/Africa/Tunis \ + usr/share/zoneinfo/Africa/Windhoek \ + usr/share/zoneinfo/Australia/ \ + usr/share/zoneinfo/Australia/Adelaide \ + usr/share/zoneinfo/Australia/Brisbane \ + usr/share/zoneinfo/Australia/Broken_Hill \ + usr/share/zoneinfo/Australia/Darwin \ + usr/share/zoneinfo/Australia/Eucla \ + usr/share/zoneinfo/Australia/Hobart \ + usr/share/zoneinfo/Australia/Lindeman \ + usr/share/zoneinfo/Australia/Lord_Howe \ + usr/share/zoneinfo/Australia/Melbourne \ + usr/share/zoneinfo/Australia/Perth \ + usr/share/zoneinfo/Australia/Sydney \ + usr/share/zoneinfo/Atlantic/ \ + usr/share/zoneinfo/Atlantic/Azores \ + usr/share/zoneinfo/Atlantic/Bermuda \ + usr/share/zoneinfo/Atlantic/Canary \ + usr/share/zoneinfo/Atlantic/Cape_Verde \ + usr/share/zoneinfo/Atlantic/Faroe \ + usr/share/zoneinfo/Atlantic/Madeira \ + usr/share/zoneinfo/Atlantic/South_Georgia \ + usr/share/zoneinfo/Atlantic/Stanley \ + usr/share/zoneinfo/Etc/ \ + usr/share/zoneinfo/Etc/UTC \ + usr/share/zoneinfo/Etc/GMT-14 \ + usr/share/zoneinfo/Etc/GMT-13 \ + usr/share/zoneinfo/Etc/GMT-12 \ + usr/share/zoneinfo/Etc/GMT-11 \ + usr/share/zoneinfo/Etc/GMT-10 \ + usr/share/zoneinfo/Etc/GMT-9 \ + usr/share/zoneinfo/Etc/GMT-8 \ + usr/share/zoneinfo/Etc/GMT-7 \ + usr/share/zoneinfo/Etc/GMT-6 \ + usr/share/zoneinfo/Etc/GMT-5 \ + usr/share/zoneinfo/Etc/GMT-4 \ + usr/share/zoneinfo/Etc/GMT-3 \ + usr/share/zoneinfo/Etc/GMT-2 \ + usr/share/zoneinfo/Etc/GMT-1 \ + usr/share/zoneinfo/Etc/GMT \ + usr/share/zoneinfo/Etc/GMT+1 \ + usr/share/zoneinfo/Etc/GMT+2 \ + usr/share/zoneinfo/Etc/GMT+3 \ + usr/share/zoneinfo/Etc/GMT+4 \ + usr/share/zoneinfo/Etc/GMT+5 \ + usr/share/zoneinfo/Etc/GMT+6 \ + usr/share/zoneinfo/Etc/GMT+7 \ + usr/share/zoneinfo/Etc/GMT+8 \ + usr/share/zoneinfo/Etc/GMT+9 \ + usr/share/zoneinfo/Etc/GMT+10 \ + usr/share/zoneinfo/Etc/GMT+11 \ + usr/share/zoneinfo/Etc/GMT+12 \ + usr/share/zoneinfo/Indian/ \ + usr/share/zoneinfo/Indian/Chagos \ + usr/share/zoneinfo/Indian/Maldives \ + usr/share/zoneinfo/Indian/Mauritius + +THIRD_PARTY_TZ_A_OBJS = \ + $(THIRD_PARTY_TZ_A_SRCS:%.c=o/$(MODE)/%.o) \ + $(LIBC_TIME_ZONEINFOS:%=o/$(MODE)/%.zip.o) + +THIRD_PARTY_TZ_A_CHECKS = \ + $(THIRD_PARTY_TZ_A).pkg \ + $(THIRD_PARTY_TZ_A_HDRS:%=o/$(MODE)/%.ok) + +THIRD_PARTY_TZ_A_DIRECTDEPS = \ + LIBC_INTRIN \ + LIBC_CALLS \ + LIBC_MEM \ + LIBC_NEXGEN32E \ + LIBC_NT_KERNEL32 \ + LIBC_RUNTIME \ + LIBC_STDIO \ + LIBC_STR \ + LIBC_SYSV + +THIRD_PARTY_TZ_A_DEPS := \ + $(call uniq,$(foreach x,$(THIRD_PARTY_TZ_A_DIRECTDEPS),$($(x)))) + +$(THIRD_PARTY_TZ_A): \ + third_party/tz/ \ + $(THIRD_PARTY_TZ_A).pkg \ + $(THIRD_PARTY_TZ_A_OBJS) + +$(THIRD_PARTY_TZ_A).pkg: \ + $(THIRD_PARTY_TZ_A_OBJS) \ + $(foreach x,$(THIRD_PARTY_TZ_A_DIRECTDEPS),$($(x)_A).pkg) + +# make this library tinier +o/$(MODE)/third_party/tz/strftime.o: private CFLAGS += -fno-jump-tables +o/$(MODE)/third_party/tz/localtime.o: private CFLAGS += -fdata-sections -ffunction-sections + +# offer same stack safety assurances as cosmo libc +$(THIRD_PARTY_TZ_A_OBJS): private COPTS += -Wframe-larger-than=4096 -Walloca-larger-than=4096 + +o/$(MODE)/usr/share/zoneinfo/.zip.o: usr/share/zoneinfo + +THIRD_PARTY_TZ_LIBS = $(foreach x,$(THIRD_PARTY_TZ_ARTIFACTS),$($(x))) +THIRD_PARTY_TZ_SRCS = $(foreach x,$(THIRD_PARTY_TZ_ARTIFACTS),$($(x)_SRCS)) +THIRD_PARTY_TZ_HDRS = $(foreach x,$(THIRD_PARTY_TZ_ARTIFACTS),$($(x)_HDRS)) +THIRD_PARTY_TZ_BINS = $(foreach x,$(THIRD_PARTY_TZ_ARTIFACTS),$($(x)_BINS)) +THIRD_PARTY_TZ_CHECKS = $(foreach x,$(THIRD_PARTY_TZ_ARTIFACTS),$($(x)_CHECKS)) +THIRD_PARTY_TZ_OBJS = $(foreach x,$(THIRD_PARTY_TZ_ARTIFACTS),$($(x)_OBJS)) +$(THIRD_PARTY_TZ_OBJS): $(BUILD_FILES) third_party/tz/BUILD.mk + +.PHONY: o/$(MODE)/third_party/tz +o/$(MODE)/third_party/tz: \ + $(THIRD_PARTY_TZ_A) \ + $(THIRD_PARTY_TZ_CHECKS) diff --git a/third_party/tz/LICENSE b/third_party/tz/LICENSE new file mode 100644 index 000000000..8ba4399c6 --- /dev/null +++ b/third_party/tz/LICENSE @@ -0,0 +1,5 @@ +Unless specified below, all files in the tz code and data (including +this LICENSE file) are in the public domain. + +If the files date.c, newstrftime.3, and strftime.c are present, they +contain material derived from BSD and use the BSD 3-clause license. diff --git a/third_party/tz/README.cosmo b/third_party/tz/README.cosmo new file mode 100644 index 000000000..7f209b0a5 --- /dev/null +++ b/third_party/tz/README.cosmo @@ -0,0 +1,25 @@ +DESCRIPTION + + tz is a library for handling time zones + +LICENSE + + See LICENSE file + +ORIGIN + + git@github.com:eggert/tz.git + a75a6251d30b28a7badc1763296205adf67a5081 + Paul Eggert + +BUILD PROCESS + + make -j8 install BACKWARD= DESTDIR=stage REDO=posix_only + +LOCAL CHANGES + + - Add aliases for legacy Cosmo timezone names. + - Add yoinks for embedding time zones in binary. + - Make localtime() posix thread cancelation safe. + - Improve readabiilty with "localtime_" prefixes. + - Automate the TZ environment variable on Windows. diff --git a/libc/time/asctime.c b/third_party/tz/asctime.c similarity index 57% rename from libc/time/asctime.c rename to third_party/tz/asctime.c index 1762165e7..eb257aa31 100644 --- a/libc/time/asctime.c +++ b/third_party/tz/asctime.c @@ -1,9 +1,10 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/str/str.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" -#include "libc/time/tz.internal.h" -#include "third_party/python/Include/object.h" -// clang-format off +#include "libc/stdio/stdio.h" +#include "private.h" + /* asctime and asctime_r a la POSIX and ISO C, except pad years before 1000. */ /* @@ -17,12 +18,8 @@ ** whereas the output of asctime is supposed to be constant. */ -/* -** Some systems only handle "%.2d"; others only handle "%02d"; -** "%02.2d" makes (most) everybody happy. -** At least some versions of gcc warn about the %02.2d; -** we conditionalize below to avoid the warning. -*/ +/*LINTLIBRARY*/ + /* ** All years associated with 32-bit time_t values are exactly four digits long; ** some years associated with 64-bit time_t values are not. @@ -35,24 +32,16 @@ ** The ISO C and POSIX standards prohibit padding the year, ** but many implementations pad anyway; most likely the standards are buggy. */ -#ifdef __GNUC__ -#define ASCTIME_FMT "%s %s%3d %2.2d:%2.2d:%2.2d %-4s\n" -#else /* !defined __GNUC__ */ -#define ASCTIME_FMT "%s %s%3d %02.2d:%02.2d:%02.2d %-4s\n" -#endif /* !defined __GNUC__ */ +static char const ASCTIME_FMT[] = "%s %s%3d %.2d:%.2d:%.2d %-4s\n"; /* ** For years that are more than four digits we put extra spaces before the year ** so that code trying to overwrite the newline won't end up overwriting ** a digit within a year and truncating the year (operating on the assumption ** that no output is better than wrong output). */ -#ifdef __GNUC__ -#define ASCTIME_FMT_B "%s %s%3d %2.2d:%2.2d:%2.2d %s\n" -#else /* !defined __GNUC__ */ -#define ASCTIME_FMT_B "%s %s%3d %02.2d:%02.2d:%02.2d %s\n" -#endif /* !defined __GNUC__ */ +static char const ASCTIME_FMT_B[] = "%s %s%3d %.2d:%.2d:%.2d %s\n"; -#define STD_ASCTIME_BUF_SIZE 26 +enum { STD_ASCTIME_BUF_SIZE = 26 }; /* ** Big enough for something such as ** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n @@ -60,20 +49,35 @@ ** seven explicit spaces, two explicit colons, a newline, ** and a trailing NUL byte). ** The values above are for systems where an int is 32 bits and are provided -** as an example; the define below calculates the maximum for the system at +** as an example; the size expression below is a bound for the system at ** hand. */ -#define MAX_ASCTIME_BUF_SIZE (2*3+5*INT_STRLEN_MAXIMUM(int)+7+2+1+1) +static char buf_asctime[2*3 + 5*INT_STRLEN_MAXIMUM(int) + 7 + 2 + 1 + 1]; -static char buf_asctime[MAX_ASCTIME_BUF_SIZE]; +/* A similar buffer for ctime. + C89 requires that they be the same buffer. + This requirement was removed in C99, so support it only if requested, + as support is more likely to lead to bugs in badly written programs. */ +#if SUPPORT_C89 +# define buf_ctime buf_asctime +#else +static char buf_ctime[sizeof buf_asctime]; +#endif char * -asctime_r(register const struct tm *timeptr, char buf[hasatleast 26]) +asctime_r(struct tm const *restrict timeptr, char *restrict buf) { + static const char wday_name[][4] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; + static const char mon_name[][4] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; register const char * wn; register const char * mn; char year[INT_STRLEN_MAXIMUM(int) + 2]; - char result[MAX_ASCTIME_BUF_SIZE]; + char result[sizeof buf_asctime]; if (timeptr == NULL) { errno = EINVAL; @@ -81,10 +85,10 @@ asctime_r(register const struct tm *timeptr, char buf[hasatleast 26]) } if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK) wn = "???"; - else wn = kWeekdayNameShort[timeptr->tm_wday]; + else wn = wday_name[timeptr->tm_wday]; if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR) mn = "???"; - else mn = kMonthNameShort[timeptr->tm_mon]; + else mn = mon_name[timeptr->tm_mon]; /* ** Use strftime's %Y to generate the year, to avoid overflow problems ** when computing timeptr->tm_year + TM_YEAR_BASE. @@ -95,13 +99,14 @@ asctime_r(register const struct tm *timeptr, char buf[hasatleast 26]) /* ** We avoid using snprintf since it's not available on all systems. */ - (sprintf)(result, - ((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B), - wn, mn, - timeptr->tm_mday, timeptr->tm_hour, - timeptr->tm_min, timeptr->tm_sec, - year); - if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime) + sprintf(result, + ((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B), + wn, mn, + timeptr->tm_mday, timeptr->tm_hour, + timeptr->tm_min, timeptr->tm_sec, + year); + if (strlen(result) < STD_ASCTIME_BUF_SIZE + || buf == buf_ctime || buf == buf_asctime) return strcpy(buf, result); else { errno = EOVERFLOW; @@ -114,3 +119,17 @@ asctime(register const struct tm *timeptr) { return asctime_r(timeptr, buf_asctime); } + +char * +ctime_r(const time_t *timep, char *buf) +{ + struct tm mytm; + struct tm *tmp = localtime_r(timep, &mytm); + return tmp ? asctime_r(tmp, buf) : NULL; +} + +char * +ctime(const time_t *timep) +{ + return ctime_r(timep, buf_ctime); +} diff --git a/third_party/tz/ctime.c b/third_party/tz/ctime.c new file mode 100644 index 000000000..4e453c2d1 --- /dev/null +++ b/third_party/tz/ctime.c @@ -0,0 +1,22 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/weirdtypes.h" +#include "libc/time.h" + +/** + * Represents time as string. + * @threadunsafe + */ +char * +ctime(const time_t *timep) +{ + /* + ** Section 4.12.3.2 of X3.159-1989 requires that + ** The ctime function converts the calendar time pointed to by timer + ** to local time in the form of a string. It is equivalent to + ** asctime(localtime(timer)) + */ + struct tm *tmp = localtime(timep); + return tmp ? asctime(tmp) : NULL; +} diff --git a/third_party/tz/ctime_r.c b/third_party/tz/ctime_r.c new file mode 100644 index 000000000..d850a4e7b --- /dev/null +++ b/third_party/tz/ctime_r.c @@ -0,0 +1,13 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/weirdtypes.h" +#include "libc/time.h" + +char * +ctime_r(const time_t *timep, char *buf) +{ + struct tm mytm; + struct tm *tmp = localtime_r(timep, &mytm); + return tmp ? asctime_r(tmp, buf) : NULL; +} diff --git a/third_party/tz/daylight.c b/third_party/tz/daylight.c new file mode 100644 index 000000000..30d400598 --- /dev/null +++ b/third_party/tz/daylight.c @@ -0,0 +1,6 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/time.h" + +int daylight; diff --git a/libc/time/difftime.c b/third_party/tz/difftime.c similarity index 70% rename from libc/time/difftime.c rename to third_party/tz/difftime.c index 077db69da..929dd5b14 100644 --- a/libc/time/difftime.c +++ b/third_party/tz/difftime.c @@ -1,18 +1,14 @@ -/*-*- mode:c; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ │ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/weirdtypes.h" #include "libc/macros.internal.h" -#include "libc/time/tz.internal.h" -// clang-format off +#include "libc/time.h" + /* Return the difference between two timestamps. */ -/* -** This file is in the public domain, so clarified as of -** 1996-06-05 by Arthur David Olson. -*/ - /* Return -X as a double. Using this avoids casting to 'double'. */ -static inline double +static double dminus(double x) { return -x; @@ -26,8 +22,8 @@ difftime(time_t time1, time_t time0) ** (assuming that the larger type has more precision). */ if (sizeof(time_t) < sizeof(double)) { - double t1 = time1, t0 = time0; - return t1 - t0; + double t1 = time1, t0 = time0; + return t1 - t0; } /* @@ -35,12 +31,12 @@ difftime(time_t time1, time_t time0) ** if the minuend is greater than or equal to the subtrahend. */ if (!TYPE_SIGNED(time_t)) - return time0 <= time1 ? time1 - time0 : dminus(time0 - time1); + return time0 <= time1 ? time1 - time0 : dminus(time0 - time1); /* Use uintmax_t if wide enough. */ if (sizeof(time_t) <= sizeof(uintmax_t)) { - uintmax_t t1 = time1, t0 = time0; - return time0 <= time1 ? t1 - t0 : dminus(t0 - t1); + uintmax_t t1 = time1, t0 = time0; + return time0 <= time1 ? t1 - t0 : dminus(t0 - t1); } /* @@ -48,7 +44,7 @@ difftime(time_t time1, time_t time0) ** (meaning that their difference cannot overflow). */ if ((time1 < 0) == (time0 < 0)) - return time1 - time0; + return time1 - time0; /* ** The values have opposite signs and uintmax_t is too narrow. @@ -56,7 +52,7 @@ difftime(time_t time1, time_t time0) ** by using long double temporaries. */ { - long double t1 = time1, t0 = time0; - return t1 - t0; + long double t1 = time1, t0 = time0; + return t1 - t0; } } diff --git a/libc/time/localtime.c b/third_party/tz/localtime.c similarity index 50% rename from libc/time/localtime.c rename to third_party/tz/localtime.c index 3c5c567c8..47975e3ed 100644 --- a/libc/time/localtime.c +++ b/third_party/tz/localtime.c @@ -1,4 +1,4 @@ -/*-*- mode:c; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ │ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ ╚─────────────────────────────────────────────────────────────────────────────*/ #define LOCALTIME_IMPLEMENTATION @@ -12,30 +12,21 @@ #include "libc/sysv/consts/o.h" #include "libc/thread/thread.h" #include "libc/thread/tls.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" -#include "libc/time/tz.internal.h" -#include "libc/time/tzfile.internal.h" +#include "libc/time.h" +#include "libc/inttypes.h" +#include "libc/sysv/consts/ok.h" +#include "libc/runtime/runtime.h" +#include "libc/stdckdint.h" +#include "libc/time.h" +#include "tzdir.h" +#include "tzfile.h" +#include "libc/nt/struct/timezoneinformation.h" +#include "libc/nt/time.h" +#include "libc/dce.h" +#include "private.h" -__static_yoink("zipos"); -__static_yoink("usr/share/zoneinfo/"); -__static_yoink("usr/share/zoneinfo/Anchorage"); -__static_yoink("usr/share/zoneinfo/Beijing"); -__static_yoink("usr/share/zoneinfo/Berlin"); -__static_yoink("usr/share/zoneinfo/Boulder"); -__static_yoink("usr/share/zoneinfo/Chicago"); -__static_yoink("usr/share/zoneinfo/GMT"); -__static_yoink("usr/share/zoneinfo/GST"); -__static_yoink("usr/share/zoneinfo/Honolulu"); -__static_yoink("usr/share/zoneinfo/Israel"); -__static_yoink("usr/share/zoneinfo/Japan"); -__static_yoink("usr/share/zoneinfo/London"); -__static_yoink("usr/share/zoneinfo/Melbourne"); -__static_yoink("usr/share/zoneinfo/New_York"); -__static_yoink("usr/share/zoneinfo/UTC"); - -// clang-format off /* Convert timestamp from time_t to struct tm. */ + /* ** This file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson. @@ -43,44 +34,644 @@ __static_yoink("usr/share/zoneinfo/UTC"); /* ** Leap second handling from Bradley White. -** POSIX-style TZ environment variable handling from Guy Harris. +** POSIX.1-1988 style TZ environment variable handling from Guy Harris. */ -static pthread_mutex_t locallock; +/*LINTLIBRARY*/ -void localtime_wipe(void) { +__static_yoink("zipos"); + +__static_yoink("usr/share/zoneinfo/"); +__static_yoink("usr/share/zoneinfo/GMT"); // Greenwich Mean Time (UTC +0) +__static_yoink("usr/share/zoneinfo/EST5EDT"); // Eastern Standard Time (UTC -5) and Eastern Daylight Time (UTC -4) +__static_yoink("usr/share/zoneinfo/CST6CDT"); // Central Standard Time (UTC -6) and Central Daylight Time (UTC -5) +__static_yoink("usr/share/zoneinfo/MST7MDT"); // Mountain Standard Time (UTC -7) and Mountain Daylight Time (UTC -6) +__static_yoink("usr/share/zoneinfo/PST8PDT"); // Pacific Standard Time (UTC -8) and Pacific Daylight Time (UTC -7) +__static_yoink("usr/share/zoneinfo/EST"); // Eastern Standard Time (UTC -5) +__static_yoink("usr/share/zoneinfo/HST"); // Hawaii Standard Time (UTC -10) +__static_yoink("usr/share/zoneinfo/MST"); // Mountain Standard Time (UTC -7) +__static_yoink("usr/share/zoneinfo/EET"); // Eastern European Time (UTC +2) +__static_yoink("usr/share/zoneinfo/MET"); // Middle European Time (UTC +1), also known as Central European Time +__static_yoink("usr/share/zoneinfo/CET"); // Central European Time (UTC +1) +__static_yoink("usr/share/zoneinfo/WET"); // Western European Time (UTC +0) + +__static_yoink("usr/share/zoneinfo/Etc/"); +__static_yoink("usr/share/zoneinfo/Etc/UTC"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-14"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-13"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-12"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-11"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-10"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-9"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-8"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-7"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-6"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-5"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-4"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-3"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-2"); +__static_yoink("usr/share/zoneinfo/Etc/GMT-1"); +__static_yoink("usr/share/zoneinfo/Etc/GMT"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+1"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+2"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+3"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+4"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+5"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+6"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+7"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+8"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+9"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+10"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+11"); +__static_yoink("usr/share/zoneinfo/Etc/GMT+12"); + +__static_yoink("usr/share/zoneinfo/America/"); +__static_yoink("usr/share/zoneinfo/America/Los_Angeles"); // U.S. +__static_yoink("usr/share/zoneinfo/America/New_York"); // U.S. +__static_yoink("usr/share/zoneinfo/America/Chicago"); // U.S. +__static_yoink("usr/share/zoneinfo/America/Denver"); // U.S. +__static_yoink("usr/share/zoneinfo/America/Anchorage"); // U.S. +__static_yoink("usr/share/zoneinfo/America/Phoenix"); // U.S. +__static_yoink("usr/share/zoneinfo/America/Mexico_City"); // Mexico +__static_yoink("usr/share/zoneinfo/America/Sao_Paulo"); // Brazil +__static_yoink("usr/share/zoneinfo/America/Bogota"); // Columbia +__static_yoink("usr/share/zoneinfo/America/Lima"); // Peru +__static_yoink("usr/share/zoneinfo/America/Santiago"); // Chile +__static_yoink("usr/share/zoneinfo/America/Argentina/"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Buenos_Aires"); +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/America/Adak"); +__static_yoink("usr/share/zoneinfo/America/Araguaina"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Catamarca"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Cordoba"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Jujuy"); +__static_yoink("usr/share/zoneinfo/America/Argentina/La_Rioja"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Mendoza"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Rio_Gallegos"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Salta"); +__static_yoink("usr/share/zoneinfo/America/Argentina/San_Juan"); +__static_yoink("usr/share/zoneinfo/America/Argentina/San_Luis"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Tucuman"); +__static_yoink("usr/share/zoneinfo/America/Argentina/Ushuaia"); +__static_yoink("usr/share/zoneinfo/America/Asuncion"); +__static_yoink("usr/share/zoneinfo/America/Bahia"); +__static_yoink("usr/share/zoneinfo/America/Bahia_Banderas"); +__static_yoink("usr/share/zoneinfo/America/Barbados"); +__static_yoink("usr/share/zoneinfo/America/Belem"); +__static_yoink("usr/share/zoneinfo/America/Belize"); +__static_yoink("usr/share/zoneinfo/America/Boa_Vista"); +__static_yoink("usr/share/zoneinfo/America/Boise"); +__static_yoink("usr/share/zoneinfo/America/Cambridge_Bay"); +__static_yoink("usr/share/zoneinfo/America/Campo_Grande"); +__static_yoink("usr/share/zoneinfo/America/Cancun"); +__static_yoink("usr/share/zoneinfo/America/Caracas"); +__static_yoink("usr/share/zoneinfo/America/Cayenne"); +__static_yoink("usr/share/zoneinfo/America/Chihuahua"); +__static_yoink("usr/share/zoneinfo/America/Ciudad_Juarez"); +__static_yoink("usr/share/zoneinfo/America/Costa_Rica"); +__static_yoink("usr/share/zoneinfo/America/Cuiaba"); +__static_yoink("usr/share/zoneinfo/America/Danmarkshavn"); +__static_yoink("usr/share/zoneinfo/America/Dawson"); +__static_yoink("usr/share/zoneinfo/America/Dawson_Creek"); +__static_yoink("usr/share/zoneinfo/America/Detroit"); +__static_yoink("usr/share/zoneinfo/America/Edmonton"); +__static_yoink("usr/share/zoneinfo/America/Eirunepe"); +__static_yoink("usr/share/zoneinfo/America/El_Salvador"); +__static_yoink("usr/share/zoneinfo/America/Fort_Nelson"); +__static_yoink("usr/share/zoneinfo/America/Fortaleza"); +__static_yoink("usr/share/zoneinfo/America/Glace_Bay"); +__static_yoink("usr/share/zoneinfo/America/Goose_Bay"); +__static_yoink("usr/share/zoneinfo/America/Grand_Turk"); +__static_yoink("usr/share/zoneinfo/America/Guatemala"); +__static_yoink("usr/share/zoneinfo/America/Guayaquil"); +__static_yoink("usr/share/zoneinfo/America/Guyana"); +__static_yoink("usr/share/zoneinfo/America/Halifax"); +__static_yoink("usr/share/zoneinfo/America/Havana"); +__static_yoink("usr/share/zoneinfo/America/Hermosillo"); +__static_yoink("usr/share/zoneinfo/America/Indiana/"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Indianapolis"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Knox"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Marengo"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Petersburg"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Tell_City"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Vevay"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Vincennes"); +__static_yoink("usr/share/zoneinfo/America/Indiana/Winamac"); +__static_yoink("usr/share/zoneinfo/America/Inuvik"); +__static_yoink("usr/share/zoneinfo/America/Iqaluit"); +__static_yoink("usr/share/zoneinfo/America/Jamaica"); +__static_yoink("usr/share/zoneinfo/America/Juneau"); +__static_yoink("usr/share/zoneinfo/America/Kentucky/"); +__static_yoink("usr/share/zoneinfo/America/Kentucky/Louisville"); +__static_yoink("usr/share/zoneinfo/America/Kentucky/Monticello"); +__static_yoink("usr/share/zoneinfo/America/La_Paz"); +__static_yoink("usr/share/zoneinfo/America/Maceio"); +__static_yoink("usr/share/zoneinfo/America/Managua"); +__static_yoink("usr/share/zoneinfo/America/Manaus"); +__static_yoink("usr/share/zoneinfo/America/Martinique"); +__static_yoink("usr/share/zoneinfo/America/Matamoros"); +__static_yoink("usr/share/zoneinfo/America/Mazatlan"); +__static_yoink("usr/share/zoneinfo/America/Menominee"); +__static_yoink("usr/share/zoneinfo/America/Merida"); +__static_yoink("usr/share/zoneinfo/America/Metlakatla"); +__static_yoink("usr/share/zoneinfo/America/Miquelon"); +__static_yoink("usr/share/zoneinfo/America/Moncton"); +__static_yoink("usr/share/zoneinfo/America/Monterrey"); +__static_yoink("usr/share/zoneinfo/America/Montevideo"); +__static_yoink("usr/share/zoneinfo/America/Nome"); +__static_yoink("usr/share/zoneinfo/America/Noronha"); +__static_yoink("usr/share/zoneinfo/America/North_Dakota/"); +__static_yoink("usr/share/zoneinfo/America/North_Dakota/Beulah"); +__static_yoink("usr/share/zoneinfo/America/North_Dakota/Center"); +__static_yoink("usr/share/zoneinfo/America/North_Dakota/New_Salem"); +__static_yoink("usr/share/zoneinfo/America/Nuuk"); +__static_yoink("usr/share/zoneinfo/America/Ojinaga"); +__static_yoink("usr/share/zoneinfo/America/Panama"); +__static_yoink("usr/share/zoneinfo/America/Paramaribo"); +__static_yoink("usr/share/zoneinfo/America/Port-au-Prince"); +__static_yoink("usr/share/zoneinfo/America/Porto_Velho"); +__static_yoink("usr/share/zoneinfo/America/Puerto_Rico"); +__static_yoink("usr/share/zoneinfo/America/Punta_Arenas"); +__static_yoink("usr/share/zoneinfo/America/Rankin_Inlet"); +__static_yoink("usr/share/zoneinfo/America/Recife"); +__static_yoink("usr/share/zoneinfo/America/Regina"); +__static_yoink("usr/share/zoneinfo/America/Resolute"); +__static_yoink("usr/share/zoneinfo/America/Rio_Branco"); +__static_yoink("usr/share/zoneinfo/America/Santarem"); +__static_yoink("usr/share/zoneinfo/America/Santo_Domingo"); +__static_yoink("usr/share/zoneinfo/America/Scoresbysund"); +__static_yoink("usr/share/zoneinfo/America/Sitka"); +__static_yoink("usr/share/zoneinfo/America/St_Johns"); +__static_yoink("usr/share/zoneinfo/America/Swift_Current"); +__static_yoink("usr/share/zoneinfo/America/Tegucigalpa"); +__static_yoink("usr/share/zoneinfo/America/Thule"); +__static_yoink("usr/share/zoneinfo/America/Tijuana"); +__static_yoink("usr/share/zoneinfo/America/Toronto"); +__static_yoink("usr/share/zoneinfo/America/Vancouver"); +__static_yoink("usr/share/zoneinfo/America/Whitehorse"); +__static_yoink("usr/share/zoneinfo/America/Winnipeg"); +__static_yoink("usr/share/zoneinfo/America/Yakuatt"); +#endif + +__static_yoink("usr/share/zoneinfo/Europe/"); +__static_yoink("usr/share/zoneinfo/Europe/Zurich"); // Switzerland +__static_yoink("usr/share/zoneinfo/Europe/Dublin"); // Ireland +__static_yoink("usr/share/zoneinfo/Europe/London"); // UK +__static_yoink("usr/share/zoneinfo/Europe/Paris"); // France +__static_yoink("usr/share/zoneinfo/Europe/Berlin"); // Germany +__static_yoink("usr/share/zoneinfo/Europe/Rome"); // Italy +__static_yoink("usr/share/zoneinfo/Europe/Moscow"); // Moscow +__static_yoink("usr/share/zoneinfo/Europe/Madrid"); // Spain +__static_yoink("usr/share/zoneinfo/Europe/Warsaw"); // Poland +__static_yoink("usr/share/zoneinfo/Europe/Brussels"); // Belgium +__static_yoink("usr/share/zoneinfo/Europe/Budapest"); // Hungary +__static_yoink("usr/share/zoneinfo/Europe/Vienna"); // Austria +__static_yoink("usr/share/zoneinfo/Europe/Prague"); // Czech Republic +__static_yoink("usr/share/zoneinfo/Europe/Kyiv"); // Ukraine +__static_yoink("usr/share/zoneinfo/Europe/Istanbul"); // Turkey +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Europe/Lisbon"); +__static_yoink("usr/share/zoneinfo/Europe/Athens"); +__static_yoink("usr/share/zoneinfo/Europe/Andorra"); +__static_yoink("usr/share/zoneinfo/Europe/Astrakhan"); +__static_yoink("usr/share/zoneinfo/Europe/Belgrade"); +__static_yoink("usr/share/zoneinfo/Europe/Bucharest"); +__static_yoink("usr/share/zoneinfo/Europe/Chisinau"); +__static_yoink("usr/share/zoneinfo/Europe/Gibraltar"); +__static_yoink("usr/share/zoneinfo/Europe/Helsinki"); +__static_yoink("usr/share/zoneinfo/Europe/Kaliningrad"); +__static_yoink("usr/share/zoneinfo/Europe/Kirov"); +__static_yoink("usr/share/zoneinfo/Europe/Malta"); +__static_yoink("usr/share/zoneinfo/Europe/Minsk"); +__static_yoink("usr/share/zoneinfo/Europe/Riga"); +__static_yoink("usr/share/zoneinfo/Europe/Samara"); +__static_yoink("usr/share/zoneinfo/Europe/Saratov"); +__static_yoink("usr/share/zoneinfo/Europe/Simferopol"); +__static_yoink("usr/share/zoneinfo/Europe/Sofia"); +__static_yoink("usr/share/zoneinfo/Europe/Tallinn"); +__static_yoink("usr/share/zoneinfo/Europe/Tirane"); +__static_yoink("usr/share/zoneinfo/Europe/Ulyanovsk"); +__static_yoink("usr/share/zoneinfo/Europe/Vilnius"); +__static_yoink("usr/share/zoneinfo/Europe/Volgograd"); +#endif + +__static_yoink("usr/share/zoneinfo/Asia/"); +__static_yoink("usr/share/zoneinfo/Asia/Jerusalem"); // Israel +__static_yoink("usr/share/zoneinfo/Asia/Taipei"); // Taiwan +__static_yoink("usr/share/zoneinfo/Asia/Kolkata"); // India +__static_yoink("usr/share/zoneinfo/Asia/Tokyo"); // Japan +__static_yoink("usr/share/zoneinfo/Asia/Shanghai"); // China +__static_yoink("usr/share/zoneinfo/Asia/Dubai"); // U.A.E. +__static_yoink("usr/share/zoneinfo/Asia/Seoul"); // South Korea +__static_yoink("usr/share/zoneinfo/Asia/Singapore"); // Singapore +__static_yoink("usr/share/zoneinfo/Asia/Tehran"); // Iran +__static_yoink("usr/share/zoneinfo/Asia/Hong_Kong"); // Hong Kong +__static_yoink("usr/share/zoneinfo/Asia/Manila"); // Philippines +__static_yoink("usr/share/zoneinfo/Asia/Bangkok"); // Thailand +__static_yoink("usr/share/zoneinfo/Asia/Jakarta"); // Indonesia +__static_yoink("usr/share/zoneinfo/Asia/Karachi"); // Pakistan +__static_yoink("usr/share/zoneinfo/Asia/Kabul"); // Afghanistan +__static_yoink("usr/share/zoneinfo/Asia/Dhaka"); // Bangladesh +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Asia/Almaty"); +__static_yoink("usr/share/zoneinfo/Asia/Amman"); +__static_yoink("usr/share/zoneinfo/Asia/Anadyr"); +__static_yoink("usr/share/zoneinfo/Asia/Aqtau"); +__static_yoink("usr/share/zoneinfo/Asia/Aqtobe"); +__static_yoink("usr/share/zoneinfo/Asia/Ashgabat"); +__static_yoink("usr/share/zoneinfo/Asia/Atyrau"); +__static_yoink("usr/share/zoneinfo/Asia/Baghdad"); +__static_yoink("usr/share/zoneinfo/Asia/Baku"); +__static_yoink("usr/share/zoneinfo/Asia/Barnaul"); +__static_yoink("usr/share/zoneinfo/Asia/Beirut"); +__static_yoink("usr/share/zoneinfo/Asia/Bishkek"); +__static_yoink("usr/share/zoneinfo/Asia/Chita"); +__static_yoink("usr/share/zoneinfo/Asia/Choibalsan"); +__static_yoink("usr/share/zoneinfo/Asia/Colombo"); +__static_yoink("usr/share/zoneinfo/Asia/Damascus"); +__static_yoink("usr/share/zoneinfo/Asia/Dili"); +__static_yoink("usr/share/zoneinfo/Asia/Dushanbe"); +__static_yoink("usr/share/zoneinfo/Asia/Famagusta"); +__static_yoink("usr/share/zoneinfo/Asia/Gaza"); +__static_yoink("usr/share/zoneinfo/Asia/Hebron"); +__static_yoink("usr/share/zoneinfo/Asia/Ho_Chi_Minh"); +__static_yoink("usr/share/zoneinfo/Asia/Hovd"); +__static_yoink("usr/share/zoneinfo/Asia/Irkutsk"); +__static_yoink("usr/share/zoneinfo/Asia/Jayapura"); +__static_yoink("usr/share/zoneinfo/Asia/Kamchatka"); +__static_yoink("usr/share/zoneinfo/Asia/Kathmandu"); +__static_yoink("usr/share/zoneinfo/Asia/Khandyga"); +__static_yoink("usr/share/zoneinfo/Asia/Krasnoyarsk"); +__static_yoink("usr/share/zoneinfo/Asia/Kuching"); +__static_yoink("usr/share/zoneinfo/Asia/Macau"); +__static_yoink("usr/share/zoneinfo/Asia/Magadan"); +__static_yoink("usr/share/zoneinfo/Asia/Makassar"); +__static_yoink("usr/share/zoneinfo/Asia/Nicosia"); +__static_yoink("usr/share/zoneinfo/Asia/Novokuznetsk"); +__static_yoink("usr/share/zoneinfo/Asia/Novosibirsk"); +__static_yoink("usr/share/zoneinfo/Asia/Omsk"); +__static_yoink("usr/share/zoneinfo/Asia/Oral"); +__static_yoink("usr/share/zoneinfo/Asia/Pontianak"); +__static_yoink("usr/share/zoneinfo/Asia/Pyongyang"); +__static_yoink("usr/share/zoneinfo/Asia/Qatar"); +__static_yoink("usr/share/zoneinfo/Asia/Qostanay"); +__static_yoink("usr/share/zoneinfo/Asia/Qyzylorda"); +__static_yoink("usr/share/zoneinfo/Asia/Riyadh"); +__static_yoink("usr/share/zoneinfo/Asia/Sakhalin"); +__static_yoink("usr/share/zoneinfo/Asia/Samarkand"); +__static_yoink("usr/share/zoneinfo/Asia/Srednekolymsk"); +__static_yoink("usr/share/zoneinfo/Asia/Tashkent"); +__static_yoink("usr/share/zoneinfo/Asia/Tbilisi"); +__static_yoink("usr/share/zoneinfo/Asia/Thimphu"); +__static_yoink("usr/share/zoneinfo/Asia/Tomsk"); +__static_yoink("usr/share/zoneinfo/Asia/Ulaanbaatar"); +__static_yoink("usr/share/zoneinfo/Asia/Urumqi"); +__static_yoink("usr/share/zoneinfo/Asia/Ust-Nera"); +__static_yoink("usr/share/zoneinfo/Asia/Vladivostok"); +__static_yoink("usr/share/zoneinfo/Asia/Yakutsk"); +__static_yoink("usr/share/zoneinfo/Asia/Yangon"); +__static_yoink("usr/share/zoneinfo/Asia/Yekaterinburg"); +__static_yoink("usr/share/zoneinfo/Asia/Yerevan"); +#endif + +__static_yoink("usr/share/zoneinfo/Pacific/"); +__static_yoink("usr/share/zoneinfo/Pacific/Honolulu"); // U.S. +__static_yoink("usr/share/zoneinfo/Pacific/Guam"); // U.S. +__static_yoink("usr/share/zoneinfo/Pacific/Auckland"); // New Zealand +__static_yoink("usr/share/zoneinfo/Pacific/Fiji"); // Fiji +__static_yoink("usr/share/zoneinfo/Pacific/Port_Moresby"); // Papua New Guinea +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Pacific/Apia"); +__static_yoink("usr/share/zoneinfo/Pacific/Bougainville"); +__static_yoink("usr/share/zoneinfo/Pacific/Chatham"); +__static_yoink("usr/share/zoneinfo/Pacific/Easter"); +__static_yoink("usr/share/zoneinfo/Pacific/Efate"); +__static_yoink("usr/share/zoneinfo/Pacific/Fakaofo"); +__static_yoink("usr/share/zoneinfo/Pacific/Galapagos"); +__static_yoink("usr/share/zoneinfo/Pacific/Gambier"); +__static_yoink("usr/share/zoneinfo/Pacific/Guadalcanal"); +__static_yoink("usr/share/zoneinfo/Pacific/Kanton"); +__static_yoink("usr/share/zoneinfo/Pacific/Kiritimati"); +__static_yoink("usr/share/zoneinfo/Pacific/Kosrae"); +__static_yoink("usr/share/zoneinfo/Pacific/Kwajalein"); +__static_yoink("usr/share/zoneinfo/Pacific/Marquesas"); +__static_yoink("usr/share/zoneinfo/Pacific/Nauru"); +__static_yoink("usr/share/zoneinfo/Pacific/Niue"); +__static_yoink("usr/share/zoneinfo/Pacific/Norfolk"); +__static_yoink("usr/share/zoneinfo/Pacific/Noumea"); +__static_yoink("usr/share/zoneinfo/Pacific/Pago_Pago"); +__static_yoink("usr/share/zoneinfo/Pacific/Palau"); +__static_yoink("usr/share/zoneinfo/Pacific/Pitcairn"); +__static_yoink("usr/share/zoneinfo/Pacific/Rarotonga"); +__static_yoink("usr/share/zoneinfo/Pacific/Tahiti"); +__static_yoink("usr/share/zoneinfo/Pacific/Tarawa"); +__static_yoink("usr/share/zoneinfo/Pacific/Tongatapu"); +#endif + +__static_yoink("usr/share/zoneinfo/Africa/"); +__static_yoink("usr/share/zoneinfo/Africa/Lagos"); // Nigeria +__static_yoink("usr/share/zoneinfo/Africa/Cairo"); // Egypt +__static_yoink("usr/share/zoneinfo/Africa/Algiers"); // Algeria +__static_yoink("usr/share/zoneinfo/Africa/Johannesburg"); // South Africa +__static_yoink("usr/share/zoneinfo/Africa/Nairobi"); // Kenya +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Africa/Casablanca"); +__static_yoink("usr/share/zoneinfo/Africa/Abidjan"); +__static_yoink("usr/share/zoneinfo/Africa/Bissau"); +__static_yoink("usr/share/zoneinfo/Africa/Ceuta"); +__static_yoink("usr/share/zoneinfo/Africa/El_Aaiun"); +__static_yoink("usr/share/zoneinfo/Africa/Juba"); +__static_yoink("usr/share/zoneinfo/Africa/Khartoum"); +__static_yoink("usr/share/zoneinfo/Africa/Maputo"); +__static_yoink("usr/share/zoneinfo/Africa/Monrovia"); +__static_yoink("usr/share/zoneinfo/Africa/Ndjamena"); +__static_yoink("usr/share/zoneinfo/Africa/Sao_Tome"); +__static_yoink("usr/share/zoneinfo/Africa/Tripoli"); +__static_yoink("usr/share/zoneinfo/Africa/Tunis"); +__static_yoink("usr/share/zoneinfo/Africa/Windhoek"); +#endif + +__static_yoink("usr/share/zoneinfo/Australia/"); +__static_yoink("usr/share/zoneinfo/Australia/Sydney"); +__static_yoink("usr/share/zoneinfo/Australia/Melbourne"); +__static_yoink("usr/share/zoneinfo/Australia/Brisbane"); +__static_yoink("usr/share/zoneinfo/Australia/Perth"); +__static_yoink("usr/share/zoneinfo/Australia/Adelaide"); +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Australia/Broken_Hill"); +__static_yoink("usr/share/zoneinfo/Australia/Darwin"); +__static_yoink("usr/share/zoneinfo/Australia/Eucla"); +__static_yoink("usr/share/zoneinfo/Australia/Hobart"); +__static_yoink("usr/share/zoneinfo/Australia/Lindeman"); +__static_yoink("usr/share/zoneinfo/Australia/Lord_Howe"); +#endif + +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Atlantic/"); +__static_yoink("usr/share/zoneinfo/Atlantic/Canary"); +__static_yoink("usr/share/zoneinfo/Atlantic/Azores"); +__static_yoink("usr/share/zoneinfo/Atlantic/Bermuda"); +__static_yoink("usr/share/zoneinfo/Atlantic/Cape_Verde"); +__static_yoink("usr/share/zoneinfo/Atlantic/Faroe"); +__static_yoink("usr/share/zoneinfo/Atlantic/Madeira"); +__static_yoink("usr/share/zoneinfo/Atlantic/South_Georgia"); +__static_yoink("usr/share/zoneinfo/Atlantic/Stanley"); +#endif + +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Indian/"); +__static_yoink("usr/share/zoneinfo/Indian/Chagos"); +__static_yoink("usr/share/zoneinfo/Indian/Maldives"); +__static_yoink("usr/share/zoneinfo/Indian/Mauritius"); +#endif + +#ifdef EMBED_EVERY_TIME_ZONE +__static_yoink("usr/share/zoneinfo/Antarctica/"); +__static_yoink("usr/share/zoneinfo/Antarctica/Casey"); +__static_yoink("usr/share/zoneinfo/Antarctica/Davis"); +__static_yoink("usr/share/zoneinfo/Antarctica/Macquarie"); +__static_yoink("usr/share/zoneinfo/Antarctica/Mawson"); +__static_yoink("usr/share/zoneinfo/Antarctica/Palmer"); +__static_yoink("usr/share/zoneinfo/Antarctica/Rothera"); +__static_yoink("usr/share/zoneinfo/Antarctica/Troll"); +__static_yoink("usr/share/zoneinfo/Antarctica/Vostok"); +#endif + +#define ABS(X) ((X) >= 0 ? (X) : -(X)) + +static const struct { + const char *const wname; + const char *const zname; +} kWindowsZones[] = { + {"AUS Eastern Standard Time", "Australia/Sydney"}, // +1000 AEST + {"Afghanistan Standard Time", "Asia/Kabul"}, // +0430 +0430 + {"Alaskan Standard Time", "America/Anchorage"}, // -0800 AKDT + {"Arabian Standard Time", "Asia/Dubai"}, // +0400 +04 + {"Arabic Standard Time", "Asia/Baghdad"}, // +0300 +03 + {"Argentina Standard Time", "America/Argentina/Buenos_Aires"}, // -0300 -03 + {"Bangladesh Standard Time", "Asia/Dhaka"}, // +0600 +06 + {"Cen. Australia Standard Time", "Australia/Adelaide"}, // +0930 ACST + {"Central Europe Standard Time", "Europe/Budapest"}, // +0200 CEST + {"Central European Standard Time", "Europe/Warsaw"}, // +0200 CEST + {"Central Standard Time (Mexico)", "America/Mexico_City"}, // -0600 CST + {"Central Standard Time", "America/Chicago"}, // -0500 CDT + {"China Standard Time", "Asia/Shanghai"}, // +0800 CST + {"Dateline Standard Time", "Etc/GMT+12"}, // -1200 -12 + {"E. Africa Standard Time", "Africa/Nairobi"}, // +0300 EAT + {"E. Australia Standard Time", "Australia/Brisbane"}, // +1000 AEST + {"E. South America Standard Time", "America/Sao_Paulo"}, // -0300 -03 + {"Eastern Standard Time", "America/New_York"}, // -0400 EDT + {"Egypt Standard Time", "Africa/Cairo"}, // +0300 EEST + {"Fiji Standard Time", "Pacific/Fiji"}, // +1200 +12 + {"GMT Standard Time", "Europe/London"}, // +0100 BST + {"Hawaiian Standard Time", "Pacific/Honolulu"}, // -1000 HST + {"India Standard Time", "Asia/Kolkata"}, // +0530 IST + {"Iran Standard Time", "Asia/Tehran"}, // +0330 +0330 + {"Israel Standard Time", "Asia/Jerusalem"}, // +0300 IDT + {"Korea Standard Time", "Asia/Seoul"}, // +0900 KST + {"Mid-Atlantic Standard Time", "Etc/GMT+2"}, // -0200 -02 + {"Mountain Standard Time", "America/Denver"}, // -0600 MDT + {"New Zealand Standard Time", "Pacific/Auckland"}, // +1200 NZST + {"Pacific SA Standard Time", "America/Santiago"}, // -0400 -04 + {"Pacific Standard Time", "America/Los_Angeles"}, // -0700 PDT + {"Pakistan Standard Time", "Asia/Karachi"}, // +0500 PKT + {"Romance Standard Time", "Europe/Paris"}, // +0200 CEST + {"Russian Standard Time", "Europe/Moscow"}, // +0300 MSK + {"SA Pacific Standard Time", "America/Bogota"}, // -0500 -05 + {"SE Asia Standard Time", "Asia/Bangkok"}, // +0700 +07 + {"Singapore Standard Time", "Asia/Singapore"}, // +0800 +08 + {"South Africa Standard Time", "Africa/Johannesburg"}, // +0200 SAST + {"Taipei Standard Time", "Asia/Taipei"}, // +0800 CST + {"Tokyo Standard Time", "Asia/Tokyo"}, // +0900 JST + {"Turkey Standard Time", "Europe/Istanbul"}, // +0300 +03 + {"US Mountain Standard Time", "America/Phoenix"}, // -0700 MST + {"UTC", "Etc/UTC"}, // +0000 UTC + {"UTC+12", "Etc/GMT-12"}, // +1200 +12 + {"UTC-02", "Etc/GMT+2"}, // -0200 -02 + {"UTC-08", "Etc/GMT+8"}, // -0800 -08 + {"UTC-09", "Etc/GMT+9"}, // -0900 -09 + {"UTC-11", "Etc/GMT+11"}, // -1100 -11 + {"W. Australia Standard Time", "Australia/Perth"}, // +0800 AWST + {"W. Central Africa Standard Time", "Africa/Lagos"}, // +0100 WAT + {"W. Europe Standard Time", "Europe/Berlin"}, // +0200 CEST + {"West Pacific Standard Time", "Pacific/Port_Moresby"}, // +1000 +10 +#ifdef EMBED_EVERY_TIME_ZONE + {"AUS Central Standard Time", "Australia/Darwin"}, // +0930 ACST + {"Aleutian Standard Time", "America/Adak"}, // -0900 HDT + {"Altai Standard Time", "Asia/Barnaul"}, // +0700 +07 + {"Arab Standard Time", "Asia/Riyadh"}, // +0300 +03 + {"Astrakhan Standard Time", "Europe/Astrakhan"}, // +0400 +04 + {"Atlantic Standard Time", "America/Halifax"}, // -0300 ADT + {"Aus Central W. Standard Time", "Australia/Eucla"}, // +0845 +0845 + {"Azerbaijan Standard Time", "Asia/Baku"}, // +0400 +04 + {"Azores Standard Time", "Atlantic/Azores"}, // +0000 +00 + {"Bahia Standard Time", "America/Bahia"}, // -0300 -03 + {"Belarus Standard Time", "Europe/Minsk"}, // +0300 +03 + {"Bougainville Standard Time", "Pacific/Bougainville"}, // +1100 +11 + {"Canada Central Standard Time", "America/Regina"}, // -0600 CST + {"Cape Verde Standard Time", "Atlantic/Cape_Verde"}, // -0100 -01 + {"Caucasus Standard Time", "Asia/Yerevan"}, // +0400 +04 + {"Central America Standard Time", "America/Guatemala"}, // -0600 CST + {"Central Asia Standard Time", "Asia/Almaty"}, // +0500 +05 + {"Central Brazilian Standard Time", "America/Cuiaba"}, // -0400 -04 + {"Central Pacific Standard Time", "Pacific/Guadalcanal"}, // +1100 +11 + {"Chatham Islands Standard Time", "Pacific/Chatham"}, // +1245 +1245 + {"Cuba Standard Time", "America/Havana"}, // -0400 CDT + {"E. Europe Standard Time", "Europe/Chisinau"}, // +0300 EEST + {"Easter Island Standard Time", "Pacific/Easter"}, // -0600 -06 + {"Eastern Standard Time (Mexico)", "America/Cancun"}, // -0500 EST + {"Ekaterinburg Standard Time", "Asia/Yekaterinburg"}, // +0500 +05 + {"FLE Standard Time", "Europe/Helsinki"}, // +0300 EEST + {"GTB Standard Time", "Europe/Bucharest"}, // +0300 EEST + {"Georgian Standard Time", "Asia/Tbilisi"}, // +0400 +04 + {"Greenwich Standard Time", "Atlantic/St_Helena"}, // +0000 GMT + {"Haiti Standard Time", "America/Port-au-Prince"}, // -0400 EDT + {"Jordan Standard Time", "Asia/Amman"}, // +0300 +03 + {"Kaliningrad Standard Time", "Europe/Kaliningrad"}, // +0200 EET + {"Kamchatka Standard Time", "Asia/Kamchatka"}, // +1200 +12 + {"Libya Standard Time", "Africa/Tripoli"}, // +0200 EET + {"Line Islands Standard Time", "Pacific/Kiritimati"}, // +1400 +14 + {"Lord Howe Standard Time", "Australia/Lord_Howe"}, // +1030 +1030 + {"Magadan Standard Time", "Asia/Magadan"}, // +1100 +11 + {"Marquesas Standard Time", "Pacific/Marquesas"}, // -0930 -0930 + {"Mauritius Standard Time", "Indian/Mauritius"}, // +0400 +04 + {"Middle East Standard Time", "Asia/Beirut"}, // +0300 EEST + {"Montevideo Standard Time", "America/Montevideo"}, // -0300 -03 + {"Morocco Standard Time", "Africa/Casablanca"}, // +0100 +01 + {"Mountain Standard Time (Mexico)", "America/Chihuahua"}, // -0600 CST + {"Myanmar Standard Time", "Asia/Yangon"}, // +0630 +0630 + {"N. Central Asia Standard Time", "Asia/Novosibirsk"}, // +0700 +07 + {"Namibia Standard Time", "Africa/Windhoek"}, // +0200 CAT + {"Nepal Standard Time", "Asia/Kathmandu"}, // +0545 +0545 + {"Newfoundland Standard Time", "America/St_Johns"}, // -0230 NDT + {"Norfolk Standard Time", "Pacific/Norfolk"}, // +1100 +11 + {"North Asia East Standard Time", "Asia/Irkutsk"}, // +0800 +08 + {"North Asia Standard Time", "Asia/Krasnoyarsk"}, // +0700 +07 + {"North Korea Standard Time", "Asia/Pyongyang"}, // +0900 KST + {"Omsk Standard Time", "Asia/Omsk"}, // +0600 +06 + {"Pacific Standard Time (Mexico)", "America/Tijuana"}, // -0700 PDT + {"Paraguay Standard Time", "America/Asuncion"}, // -0400 -04 + {"Russia Time Zone 10", "Asia/Srednekolymsk"}, // +1100 +11 + {"Russia Time Zone 11", "Asia/Kamchatka"}, // +1200 +12 + {"Russia Time Zone 3", "Europe/Samara"}, // +0400 +04 + {"SA Eastern Standard Time", "America/Cayenne"}, // -0300 -03 + {"SA Western Standard Time", "America/La_Paz"}, // -0400 -04 + {"Saint Pierre Standard Time", "America/Miquelon"}, // -0200 -02 + {"Sakhalin Standard Time", "Asia/Sakhalin"}, // +1100 +11 + {"Samoa Standard Time", "Pacific/Apia"}, // +1300 +13 + {"Sri Lanka Standard Time", "Asia/Colombo"}, // +0530 +0530 + {"Syria Standard Time", "Asia/Damascus"}, // +0300 +03 + {"Tasmania Standard Time", "Australia/Hobart"}, // +1000 AEST + {"Tocantins Standard Time", "America/Araguaina"}, // -0300 -03 + {"Tomsk Standard Time", "Asia/Tomsk"}, // +0700 +07 + {"Tonga Standard Time", "Pacific/Tongatapu"}, // +1300 +13 + {"Transbaikal Standard Time", "Asia/Chita"}, // +0900 +09 + {"Turks And Caicos Standard Time", "America/Grand_Turk"}, // -0400 EDT + {"US Eastern Standard Time", "America/Indiana/Indianapolis"}, // -0400 EDT + {"Ulaanbaatar Standard Time", "Asia/Ulaanbaatar"}, // +0800 +08 + {"Venezuela Standard Time", "America/Caracas"}, // -0400 -04 + {"Vladivostok Standard Time", "Asia/Vladivostok"}, // +1000 +10 + {"W. Mongolia Standard Time", "Asia/Hovd"}, // +0700 +07 + {"West Asia Standard Time", "Asia/Tashkent"}, // +0500 +05 + {"West Bank Standard Time", "Asia/Hebron"}, // +0300 EEST + {"Yakutsk Standard Time", "Asia/Yakutsk"}, // +0900 +09 +#endif +}; + +static int +strcmp168(const char16_t *l, const char *r) +{ + int i = 0; + while (l[i] == r[i] && r[i]) + ++i; + return l[i] - r[i]; +} + +static textwindows dontinline void +localtime_windows_init(void) +{ + int i; + if (getenv("TZ")) + return; + struct NtTimeZoneInformation tzi; + GetTimeZoneInformation(&tzi); + if (!tzi.Bias) + return; + for (i = 0; i < sizeof(kWindowsZones) / sizeof(kWindowsZones[0]); ++i) { + if (!strcmp168(tzi.StandardName, kWindowsZones[i].wname)) { + setenv("TZ", kWindowsZones[i].zname, true); + return; + } + } + int hours = ABS(tzi.Bias) / 60 % 24; + int minutes = ABS(tzi.Bias) % 60; + char buf[16]; + buf[0] = '<'; + buf[1] = tzi.Bias > 0 ? '-' : '+'; + buf[2] = '0' + hours / 10; + buf[4] = '0' + hours % 10; + buf[5] = '0' + minutes / 10; + buf[6] = '0' + minutes % 10; + buf[7] = '>'; + buf[8] = tzi.Bias > 0 ? '+' : '-'; + buf[9] = '0' + hours / 10; + buf[10] = '0' + hours % 10; + buf[11] = ':'; + buf[12] = '0' + minutes / 10; + buf[13] = '0' + minutes % 10; + buf[14] = 0; + setenv("TZ", buf, true); +} + +static pthread_mutex_t locallock = PTHREAD_MUTEX_INITIALIZER; + +static dontinline void +localtime_wipe(void) +{ pthread_mutex_init(&locallock, 0); } -void localtime_lock(void) { +static dontinline void +localtime_lock(void) +{ pthread_mutex_lock(&locallock); } -void localtime_unlock(void) { +static dontinline void +localtime_unlock(void) +{ pthread_mutex_unlock(&locallock); } __attribute__((__constructor__(80))) -static textstartup void localtime_init(void) { +textstartup static void +localtime_init(void) +{ localtime_wipe(); pthread_atfork(localtime_lock, localtime_unlock, localtime_wipe); + if (IsWindows()) + localtime_windows_init(); } -#ifndef TZ_ABBR_MAX_LEN -#define TZ_ABBR_MAX_LEN 16 -#endif /* !defined TZ_ABBR_MAX_LEN */ - #ifndef TZ_ABBR_CHAR_SET -#define TZ_ABBR_CHAR_SET \ +# define TZ_ABBR_CHAR_SET \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._" #endif /* !defined TZ_ABBR_CHAR_SET */ #ifndef TZ_ABBR_ERR_CHAR -#define TZ_ABBR_ERR_CHAR '_' +# define TZ_ABBR_ERR_CHAR '_' #endif /* !defined TZ_ABBR_ERR_CHAR */ +/* +** Support non-POSIX platforms that distinguish between text and binary files. +*/ + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + #ifndef WILDABBR /* ** Someone might make incorrect use of a time zone abbreviation: @@ -101,12 +692,13 @@ static textstartup void localtime_init(void) { ** manual page of what this "time zone abbreviation" means (doing this so ** that tzname[0] has the "normal" length of three characters). */ -#define WILDABBR " " +# define WILDABBR " " #endif /* !defined WILDABBR */ static const char wildabbr[] = WILDABBR; -static const char gmt[] = "GMT"; +static char const etc_utc[] = "Etc/UTC"; +static char const *utc = etc_utc + sizeof "Etc/" - 1; /* ** The DST rules to use if TZ has no rules and we can't load TZDEFRULES. @@ -115,11 +707,11 @@ static const char gmt[] = "GMT"; ** for historical reasons, US rules are a common default. */ #ifndef TZDEFRULESTRING -#define TZDEFRULESTRING ",M3.2.0,M11.1.0" +# define TZDEFRULESTRING ",M3.2.0,M11.1.0" #endif struct ttinfo { /* time type information */ - int32_t tt_utoff; /* UT offset in seconds */ + int_fast32_t tt_utoff; /* UT offset in seconds */ bool tt_isdst; /* used to set tm_isdst */ int tt_desigidx; /* abbreviation list index */ bool tt_ttisstd; /* transition is std time */ @@ -128,12 +720,9 @@ struct ttinfo { /* time type information */ struct lsinfo { /* leap second information */ time_t ls_trans; /* transition time */ - int32_t ls_corr; /* correction to apply */ + int_fast32_t ls_corr; /* correction to apply */ }; -#define SMALLEST(a, b) (((a) < (b)) ? (a) : (b)) -#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) - /* This abbreviation means local time is unspecified. */ static char const UNSPEC[] = "-00"; @@ -141,15 +730,19 @@ static char const UNSPEC[] = "-00"; This needs to be at least 1 for null termination in case the input data isn't properly terminated, and it also needs to be big enough for ttunspecified to work without crashing. */ -enum { CHARS_EXTRA = BIGGEST(sizeof UNSPEC, 2) - 1 }; +enum { CHARS_EXTRA = max(sizeof UNSPEC, 2) - 1 }; -#ifdef TZNAME_MAX -#define MY_TZNAME_MAX TZNAME_MAX -#endif /* defined TZNAME_MAX */ -#ifndef TZNAME_MAX -#define MY_TZNAME_MAX 255 -#endif /* !defined TZNAME_MAX */ +/* Limit to time zone abbreviation length in POSIX.1-2017-style TZ strings. + This is distinct from TZ_MAX_CHARS, which limits TZif file contents. */ +#ifndef TZNAME_MAXIMUM +# define TZNAME_MAXIMUM 255 +#endif +/* A representation of the contents of a TZif file. Ideally this + would have no size limits; the following sizes should suffice for + practical use. This struct should not be too large, as instances + are put on the stack and stacks are relatively small on some platforms. + See tzfile.h for more about the sizes. */ struct state { int leapcnt; int timecnt; @@ -160,15 +753,9 @@ struct state { time_t ats[TZ_MAX_TIMES]; unsigned char types[TZ_MAX_TIMES]; struct ttinfo ttis[TZ_MAX_TYPES]; - char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + CHARS_EXTRA, - sizeof gmt), - (2 * (MY_TZNAME_MAX + 1)))]; + char chars[max(max(TZ_MAX_CHARS + CHARS_EXTRA, sizeof "UTC"), + 2 * (TZNAME_MAXIMUM + 1))]; struct lsinfo lsis[TZ_MAX_LEAPS]; - - /* The time type to use for early times or if no transitions. - It is always zero for recent tzdb releases. - It might be nonzero for data from tzdb 2018e or earlier. */ - int defaulttype; }; enum r_type { @@ -182,25 +769,33 @@ struct rule { int r_day; /* day number of rule */ int r_week; /* week number of rule */ int r_mon; /* month number of rule */ - int32_t r_time; /* transition time of rule */ + int_fast32_t r_time; /* transition time of rule */ }; -static struct tm *gmtsub(struct state const *, time_t const *, int32_t, +static struct tm *gmtsub(struct state const *, time_t const *, int_fast32_t, struct tm *); static bool increment_overflow(int *, int); -static bool increment_overflow_time(time_t *, int32_t); -static int32_t leapcorr(struct state const *, time_t); -static bool normalize_overflow32(int32_t *, int *, int); -static struct tm *localtime_timesub(time_t const *, int32_t, - struct state const *, struct tm *); -static bool localtime_typesequiv(struct state const *, int, int); -static bool localtime_tzparse(char const *, struct state *, struct state *); +static bool increment_overflow_time(time_t *, int_fast32_t); +static int_fast32_t leapcorr(struct state const *, time_t); +static bool normalize_overflow32(int_fast32_t *, int *, int); +static struct tm *timesub(time_t const *, int_fast32_t, struct state const *, + struct tm *); +static bool localtime_tzparse(char const *, struct state *, struct state const *); +#ifdef ALL_STATE static struct state * lclptr; static struct state * gmtptr; +#endif /* defined ALL_STATE */ + +#ifndef ALL_STATE +static struct state lclmem; +static struct state gmtmem; +static struct state *const lclptr = &lclmem; +static struct state *const gmtptr = &gmtmem; +#endif /* State Farm */ #ifndef TZ_STRLEN_MAX -#define TZ_STRLEN_MAX 255 +# define TZ_STRLEN_MAX 255 #endif /* !defined TZ_STRLEN_MAX */ static char lcl_TZname[TZ_STRLEN_MAX + 1]; @@ -212,9 +807,14 @@ static int lcl_is_set; ** ctime, gmtime, localtime] return values in one of two static ** objects: a broken-down time structure and an array of char. ** Thanks to Paul Eggert for noting this. +** +** This requirement was removed in C99, so support it only if requested, +** as support is more likely to lead to bugs in badly written programs. */ +#if SUPPORT_C89 static struct tm tm; +#endif #if 2 <= HAVE_TZNAME + TZ_TIME_T char * tzname[2] = { @@ -232,7 +832,7 @@ long altzone; /* Initialize *S to a value based on UTOFF, ISDST, and DESIGIDX. */ static void -init_ttinfo(struct ttinfo *s, int32_t utoff, bool isdst, int desigidx) +init_ttinfo(struct ttinfo *s, int_fast32_t utoff, bool isdst, int desigidx) { s->tt_utoff = utoff; s->tt_isdst = isdst; @@ -250,12 +850,50 @@ ttunspecified(struct state const *sp, int i) return memcmp(abbr, UNSPEC, sizeof UNSPEC) == 0; } -forceinline int32_t detzcode(const char *const codep) { - return READ32BE(codep); +static int_fast32_t +detzcode(const char *const codep) +{ + register int_fast32_t result; + register int i; + int_fast32_t one = 1; + int_fast32_t halfmaxval = one << (32 - 2); + int_fast32_t maxval = halfmaxval - 1 + halfmaxval; + int_fast32_t minval = -1 - maxval; + + result = codep[0] & 0x7f; + for (i = 1; i < 4; ++i) + result = (result << 8) | (codep[i] & 0xff); + + if (codep[0] & 0x80) { + /* Do two's-complement negation even on non-two's-complement machines. + If the result would be minval - 1, return minval. */ + result -= !TWOS_COMPLEMENT(int_fast32_t) && result != 0; + result += minval; + } + return result; } -forceinline int64_t detzcode64(const char *const codep) { - return READ64BE(codep); +static int_fast64_t +detzcode64(const char *const codep) +{ + register int_fast64_t result; + register int i; + int_fast64_t one = 1; + int_fast64_t halfmaxval = one << (64 - 2); + int_fast64_t maxval = halfmaxval - 1 + halfmaxval; + int_fast64_t minval = -TWOS_COMPLEMENT(int_fast64_t) - maxval; + + result = codep[0] & 0x7f; + for (i = 1; i < 8; ++i) + result = (result << 8) | (codep[i] & 0xff); + + if (codep[0] & 0x80) { + /* Do two's-complement negation even on non-two's-complement machines. + If the result would be minval - 1, return minval. */ + result -= !TWOS_COMPLEMENT(int_fast64_t) && result != 0; + result += minval; + } + return result; } static void @@ -264,69 +902,92 @@ update_tzname_etc(struct state const *sp, struct ttinfo const *ttisp) #if HAVE_TZNAME tzname[ttisp->tt_isdst] = (char *) &sp->chars[ttisp->tt_desigidx]; #endif +#if USG_COMPAT if (!ttisp->tt_isdst) timezone = - ttisp->tt_utoff; +#endif #if ALTZONE if (ttisp->tt_isdst) altzone = - ttisp->tt_utoff; #endif } +/* If STDDST_MASK indicates that SP's TYPE provides useful info, + update tzname, timezone, and/or altzone and return STDDST_MASK, + diminished by the provided info if it is a specified local time. + Otherwise, return STDDST_MASK. See settzname for STDDST_MASK. */ +static int +may_update_tzname_etc(int stddst_mask, struct state *sp, int type) +{ + struct ttinfo *ttisp = &sp->ttis[type]; + int this_bit = 1 << ttisp->tt_isdst; + if (stddst_mask & this_bit) { + update_tzname_etc(sp, ttisp); + if (!ttunspecified(sp, type)) + return stddst_mask & ~this_bit; + } + return stddst_mask; +} + static void settzname(void) { register struct state * const sp = lclptr; register int i; + /* If STDDST_MASK & 1 we need info about a standard time. + If STDDST_MASK & 2 we need info about a daylight saving time. + When STDDST_MASK becomes zero we can stop looking. */ + int stddst_mask = 0; + #if HAVE_TZNAME - tzname[0] = tzname[1] = (char *) (sp ? wildabbr : gmt); + tzname[0] = tzname[1] = (char *) (sp ? wildabbr : utc); + stddst_mask = 3; #endif - daylight = 0; +#if USG_COMPAT timezone = 0; + stddst_mask = 3; +#endif #if ALTZONE altzone = 0; + stddst_mask |= 2; #endif - if (sp == NULL) { - return; - } /* ** And to get the latest time zone abbreviations into tzname. . . */ - for (i = 0; i < sp->typecnt; ++i) { - register const struct ttinfo * const ttisp = &sp->ttis[i]; - update_tzname_etc(sp, ttisp); - } - for (i = 0; i < sp->timecnt; ++i) { - register const struct ttinfo * const ttisp = - &sp->ttis[ - sp->types[i]]; - update_tzname_etc(sp, ttisp); - if (ttisp->tt_isdst) - daylight = 1; + if (sp) { + for (i = sp->timecnt - 1; stddst_mask && 0 <= i; i--) + stddst_mask = may_update_tzname_etc(stddst_mask, sp, sp->types[i]); + for (i = sp->typecnt - 1; stddst_mask && 0 <= i; i--) + stddst_mask = may_update_tzname_etc(stddst_mask, sp, i); } +#if USG_COMPAT + daylight = stddst_mask >> 1 ^ 1; +#endif } -static void +/* Replace bogus characters in time zone abbreviations. + Return 0 on success, an errno value if a time zone abbreviation is + too long. */ +static int scrub_abbrs(struct state *sp) { int i; - /* - ** First, replace bogus characters. - */ + + /* Reject overlong abbreviations. */ + for (i = 0; i < sp->charcnt - (TZNAME_MAXIMUM + 1); ) { + int len = strlen(&sp->chars[i]); + if (TZNAME_MAXIMUM < len) + return EOVERFLOW; + i += len + 1; + } + + /* Replace bogus characters. */ for (i = 0; i < sp->charcnt; ++i) if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL) sp->chars[i] = TZ_ABBR_ERR_CHAR; - /* - ** Second, truncate long abbreviations. - */ - for (i = 0; i < sp->typecnt; ++i) { - register const struct ttinfo * const ttisp = &sp->ttis[i]; - char *cp = &sp->chars[ttisp->tt_desigidx]; - if (strlen(cp) > TZ_ABBR_MAX_LEN && - strcmp(cp, GRANDPARENTED) != 0) - *(cp + TZ_ABBR_MAX_LEN) = '\0'; - } + return 0; } /* Input buffer for data read from a compiled tz file. */ @@ -334,7 +995,8 @@ union input_buffer { /* The first part of the buffer, interpreted as a header. */ struct tzhead tzhead; - /* The entire buffer. */ + /* The entire buffer. Ideally this would have no size limits; + the following should suffice for practical use. */ char buf[2 * sizeof(struct tzhead) + 2 * sizeof(struct state) + 4 * TZ_MAX_TIMES]; }; @@ -353,9 +1015,13 @@ union local_storage { struct state st; } u; - /* The file name to be opened. */ - char fullname[BIGGEST(sizeof(struct file_analysis), - sizeof tzdirslash + 1024)]; + /* The name of the file to be opened. Ideally this would have no + size limits, to support arbitrarily long Zone names. + Limiting Zone names to 1024 bytes should suffice for practical use. + However, there is no need for this to be smaller than struct + file_analysis as that struct is allocated anyway, as the other + union member. */ + char fullname[max(sizeof(struct file_analysis), sizeof tzdirslash + 1024)]; }; /* Load tz data from the file named NAME into *SP. Read extended @@ -373,6 +1039,52 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, register union input_buffer *up = &lsp->u.u; register int tzheadsize = sizeof(struct tzhead); + // [jart] 1. polyfill common aliases + // 2. polyfill legacy cosmo timezone names + if (name) { + if (startswith(name, "US/")) { + if (!strcmp(name, "US/Eastern")) + name = "America/New_York"; + else if (!strcmp(name, "US/Pacific")) + name = "America/Los_Angeles"; + else if (!strcmp(name, "US/Alaska")) + name = "America/Anchorage"; + else if (!strcmp(name, "US/Central")) + name = "America/Chicago"; + else if (!strcmp(name, "US/Hawaii")) + name = "Pacific/Honolulu"; + else if (!strcmp(name, "US/Michigan")) + name = "America/Detroit"; + else if (!strcmp(name, "US/Mountain")) + name = "America/Denver"; + } else if (!strcmp(name, "UTC")) { + name = "Etc/UTC"; + } else if (!strcmp(name, "GST")) { + name = "America/Los_Angeles"; + } else if (!strcmp(name, "Boulder")) { + name = "America/Denver"; + } else if (!strcmp(name, "Chicago")) { + name = "America/Chicago"; + } else if (!strcmp(name, "Anchorage")) { + name = "America/Anchorage"; + } else if (!strcmp(name, "Honolulu")) { + name = "Pacific/Honolulu"; + } else if (!strcmp(name, "London")) { + name = "Europe/London"; + } else if (!strcmp(name, "Berlin")) { + name = "Europe/Berlin"; + } else if (!strcmp(name, "Israel")) { + name = "Asia/Jerusalem"; + } else if (!strcmp(name, "Beijing") || + !strcmp(name, "Asia/Beijing")) { + // "In China, there are only two time zone which + // are Asia/Beijing and Asia/Urumuqi, but no + // Asia/Shanghai or Asia/Chongqing" + // https://bugs.launchpad.net/ubuntu/+source/libgweather/+bug/228554 + name = "Asia/Shanghai"; + } + } + sp->goback = sp->goahead = false; if (! name) { @@ -392,8 +1104,7 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, #endif if (!doaccess) { char const *dot; - size_t namelen = strlen(name); - if (sizeof lsp->fullname - sizeof tzdirslash <= namelen) + if (sizeof lsp->fullname - sizeof tzdirslash <= strlen(name)) return ENAMETOOLONG; /* Create a string "TZDIR/NAME". Using sprintf here @@ -431,15 +1142,15 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, for (stored = 4; stored <= 8; stored *= 2) { char version = up->tzhead.tzh_version[0]; bool skip_datablock = stored == 4 && version; - int32_t datablock_size; - int32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt); - int32_t ttisutcnt = detzcode(up->tzhead.tzh_ttisutcnt); - int64_t prevtr = -1; - int32_t prevcorr = 0; - int32_t leapcnt = detzcode(up->tzhead.tzh_leapcnt); - int32_t timecnt = detzcode(up->tzhead.tzh_timecnt); - int32_t typecnt = detzcode(up->tzhead.tzh_typecnt); - int32_t charcnt = detzcode(up->tzhead.tzh_charcnt); + int_fast32_t datablock_size; + int_fast32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt); + int_fast32_t ttisutcnt = detzcode(up->tzhead.tzh_ttisutcnt); + int_fast64_t prevtr = -1; + int_fast32_t prevcorr = 0; + int_fast32_t leapcnt = detzcode(up->tzhead.tzh_leapcnt); + int_fast32_t timecnt = detzcode(up->tzhead.tzh_timecnt); + int_fast32_t typecnt = detzcode(up->tzhead.tzh_typecnt); + int_fast32_t charcnt = detzcode(up->tzhead.tzh_charcnt); char const *p = up->buf + tzheadsize; /* Although tzfile(5) currently requires typecnt to be nonzero, support future formats that may allow zero typecnt @@ -478,7 +1189,7 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, occurred at TIME_T_MIN. */ timecnt = 0; for (i = 0; i < sp->timecnt; ++i) { - int64_t at + int_fast64_t at = stored == 4 ? detzcode(p) : detzcode64(p); sp->types[i] = at <= TIME_T_MAX; if (sp->types[i]) { @@ -530,8 +1241,8 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, /* Read leap seconds, discarding those out of time_t range. */ leapcnt = 0; for (i = 0; i < sp->leapcnt; ++i) { - int64_t tr = stored == 4 ? detzcode(p) : detzcode64(p); - int32_t corr = detzcode(p + stored); + int_fast64_t tr = stored == 4 ? detzcode(p) : detzcode64(p); + int_fast32_t corr = detzcode(p + stored); p += stored + 4; /* Leap seconds cannot occur before the Epoch, @@ -641,14 +1352,18 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, == sp->types[sp->timecnt - 2])) sp->timecnt--; - for (i = 0; - i < ts->timecnt && sp->timecnt < TZ_MAX_TIMES; - i++) { + sp->goahead = ts->goahead; + + for (i = 0; i < ts->timecnt; i++) { time_t t = ts->ats[i]; if (increment_overflow_time(&t, leapcorr(sp, t)) || (0 < sp->timecnt && t <= sp->ats[sp->timecnt - 1])) continue; + if (TZ_MAX_TIMES <= sp->timecnt) { + sp->goahead = false; + break; + } sp->ats[sp->timecnt] = t; sp->types[sp->timecnt] = (sp->typecnt + ts->types[i]); @@ -661,80 +1376,6 @@ localtime_tzloadbody_(char const *name, struct state *sp, bool doextend, } if (sp->typecnt == 0) return EINVAL; - if (sp->timecnt > 1) { - if (sp->ats[0] <= TIME_T_MAX - SECSPERREPEAT) { - time_t repeatat = sp->ats[0] + SECSPERREPEAT; - int repeattype = sp->types[0]; - for (i = 1; i < sp->timecnt; ++i) - if (sp->ats[i] == repeatat - && localtime_typesequiv(sp, sp->types[i], repeattype)) { - sp->goback = true; - break; - } - } - if (TIME_T_MIN + SECSPERREPEAT <= sp->ats[sp->timecnt - 1]) { - time_t repeatat = sp->ats[sp->timecnt - 1] - SECSPERREPEAT; - int repeattype = sp->types[sp->timecnt - 1]; - for (i = sp->timecnt - 2; i >= 0; --i) - if (sp->ats[i] == repeatat - && localtime_typesequiv(sp, sp->types[i], repeattype)) { - sp->goahead = true; - break; - } - } - } - - /* Infer sp->defaulttype from the data. Although this default - type is always zero for data from recent tzdb releases, - things are trickier for data from tzdb 2018e or earlier. - - The first set of heuristics work around bugs in 32-bit data - generated by tzdb 2013c or earlier. The workaround is for - zones like Australia/Macquarie where timestamps before the - first transition have a time type that is not the earliest - standard-time type. See: - https://mm.icann.org/pipermail/tz/2013-May/019368.html */ - /* - ** If type 0 does not specify local time, or is unused in transitions, - ** it's the type to use for early times. - */ - for (i = 0; i < sp->timecnt; ++i) - if (sp->types[i] == 0) - break; - i = i < sp->timecnt && ! ttunspecified(sp, 0) ? -1 : 0; - /* - ** Absent the above, - ** if there are transition times - ** and the first transition is to a daylight time - ** find the standard type less than and closest to - ** the type of the first transition. - */ - if (i < 0 && sp->timecnt > 0 && sp->ttis[sp->types[0]].tt_isdst) { - i = sp->types[0]; - while (--i >= 0) - if (!sp->ttis[i].tt_isdst) - break; - } - /* The next heuristics are for data generated by tzdb 2018e or - earlier, for zones like EST5EDT where the first transition - is to DST. */ - /* - ** If no result yet, find the first standard type. - ** If there is none, punt to type zero. - */ - if (i < 0) { - i = 0; - while (sp->ttis[i].tt_isdst) - if (++i >= sp->typecnt) { - i = 0; - break; - } - } - /* A simple 'sp->defaulttype = 0;' would suffice here if we - didn't have to worry about 2018e-or-earlier data. Even - simpler would be to remove the defaulttype member and just - use 0 in its place. */ - sp->defaulttype = i; return 0; } @@ -755,6 +1396,7 @@ localtime_tzloadbody(char const *name, struct state *sp, bool doextend, static int localtime_tzload(char const *name, struct state *sp, bool doextend) { +#ifdef ALL_STATE union local_storage *lsp = malloc(sizeof *lsp); if (!lsp) { return HAVE_MALLOC_ERRNO ? errno : ENOMEM; @@ -763,29 +1405,10 @@ localtime_tzload(char const *name, struct state *sp, bool doextend) free(lsp); return err; } -} - -static bool -localtime_typesequiv(const struct state *sp, int a, int b) -{ - register bool result; - - if (sp == NULL || - a < 0 || a >= sp->typecnt || - b < 0 || b >= sp->typecnt) - result = false; - else { - register const struct ttinfo * ap = &sp->ttis[a]; - register const struct ttinfo * bp = &sp->ttis[b]; - result = (ap->tt_utoff == bp->tt_utoff - && ap->tt_isdst == bp->tt_isdst - && ap->tt_ttisstd == bp->tt_ttisstd - && ap->tt_ttisut == bp->tt_ttisut - && (strcmp(&sp->chars[ap->tt_desigidx], - &sp->chars[bp->tt_desigidx]) - == 0)); - } - return result; +#else + union local_storage ls; + return localtime_tzloadbody(name, sp, doextend, &ls); +#endif } static const int mon_lengths[2][MONSPERYEAR] = { @@ -801,7 +1424,7 @@ static const int year_lengths[2] = { static inline bool is_digit(char c) { - return '0' <= c && c <= '9'; + return '0' <= c && c <= '9'; } /* @@ -878,14 +1501,14 @@ getnum(register const char *strp, int *const nump, const int min, const int max) */ static const char * -getsecs(register const char *strp, int32_t *const secsp) +getsecs(register const char *strp, int_fast32_t *const secsp) { int num; - int32_t secsperhour = SECSPERHOUR; + int_fast32_t secsperhour = SECSPERHOUR; /* - ** 'HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like - ** "M10.4.6/26", which does not conform to Posix, + ** 'HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-POSIX rules like + ** "M10.4.6/26", which does not conform to POSIX, ** but which specifies the equivalent of ** "02:00 on the first Sunday on or after 23 Oct". */ @@ -919,7 +1542,7 @@ getsecs(register const char *strp, int32_t *const secsp) */ static const char * -getoffset(register const char *strp, int32_t *const offsetp) +localtime_getoffset(register const char *strp, int_fast32_t *const offsetp) { register bool neg = false; @@ -938,13 +1561,14 @@ getoffset(register const char *strp, int32_t *const offsetp) /* ** Given a pointer into a timezone string, extract a rule in the form -** date[/time]. See POSIX section 8 for the format of "date" and "time". +** date[/time]. See POSIX Base Definitions section 8.3 variable TZ +** for the format of "date" and "time". ** If a valid rule is not found, return NULL. ** Otherwise, return a pointer to the first character not part of the rule. */ static const char * -getrule(const char *strp, register struct rule *const rulep) +localtime_getrule(const char *strp, register struct rule *const rulep) { if (*strp == 'J') { /* @@ -984,7 +1608,7 @@ getrule(const char *strp, register struct rule *const rulep) ** Time specified. */ ++strp; - strp = getoffset(strp, &rulep->r_time); + strp = localtime_getoffset(strp, &rulep->r_time); } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */ return strp; } @@ -994,12 +1618,12 @@ getrule(const char *strp, register struct rule *const rulep) ** effect, calculate the year-relative time that rule takes effect. */ -static int32_t -transtime(const int year, register const struct rule *const rulep, - const int32_t offset) +static int_fast32_t +localtime_transtime(const int year, register const struct rule *const rulep, + const int_fast32_t offset) { register bool leapyear; - register int32_t value; + register int_fast32_t value; register int i; int d, m1, yy0, yy1, yy2, dow; @@ -1069,7 +1693,7 @@ transtime(const int year, register const struct rule *const rulep, value += mon_lengths[leapyear][i] * SECSPERDAY; break; - default: UNREACHABLE(); + default: unreachable(); } /* @@ -1082,22 +1706,20 @@ transtime(const int year, register const struct rule *const rulep, } /* -** Given a POSIX section 8-style TZ string, fill in the rule tables as +** Given a POSIX.1-2017-style TZ string, fill in the rule tables as ** appropriate. */ static bool -localtime_tzparse(const char *name, struct state *sp, struct state *basep) +localtime_tzparse(const char *name, struct state *sp, struct state const *basep) { const char * stdname; const char * dstname; - size_t stdlen; - size_t dstlen; - size_t charcnt; - int32_t stdoffset; - int32_t dstoffset; + int_fast32_t stdoffset; + int_fast32_t dstoffset; register char * cp; register bool load_ok; + ptrdiff_t stdlen, dstlen, charcnt; time_t atlo = TIME_T_MIN, leaplo = TIME_T_MIN; stdname = name; @@ -1113,14 +1735,12 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) name = getzname(name); stdlen = name - stdname; } - if (!stdlen) + if (! (0 < stdlen && stdlen <= TZNAME_MAXIMUM)) return false; - name = getoffset(name, &stdoffset); + name = localtime_getoffset(name, &stdoffset); if (name == NULL) return false; charcnt = stdlen + 1; - if (sizeof sp->chars < charcnt) - return false; if (basep) { if (0 < basep->timecnt) atlo = basep->ats[basep->timecnt - 1]; @@ -1134,6 +1754,7 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) } if (0 < sp->leapcnt) leaplo = sp->lsis[sp->leapcnt - 1].ls_trans; + sp->goback = sp->goahead = false; if (*name != '\0') { if (*name == '<') { dstname = ++name; @@ -1147,13 +1768,11 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) name = getzname(name); dstlen = name - dstname; /* length of DST abbr. */ } - if (!dstlen) + if (! (0 < dstlen && dstlen <= TZNAME_MAXIMUM)) return false; charcnt += dstlen + 1; - if (sizeof sp->chars < charcnt) - return false; if (*name != '\0' && *name != ',' && *name != ';') { - name = getoffset(name, &dstoffset); + name = localtime_getoffset(name, &dstoffset); if (name == NULL) return false; } else dstoffset = stdoffset - SECSPERHOUR; @@ -1165,15 +1784,15 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) register int year; register int timecnt; time_t janfirst; - int32_t janoffset = 0; + int_fast32_t janoffset = 0; int yearbeg, yearlim; ++name; - if ((name = getrule(name, &start)) == NULL) + if ((name = localtime_getrule(name, &start)) == NULL) return false; if (*name++ != ',') return false; - if ((name = getrule(name, &end)) == NULL) + if ((name = localtime_getrule(name, &end)) == NULL) return false; if (*name != '\0') return false; @@ -1183,24 +1802,25 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) */ init_ttinfo(&sp->ttis[0], -stdoffset, false, 0); init_ttinfo(&sp->ttis[1], -dstoffset, true, stdlen + 1); - sp->defaulttype = 0; timecnt = 0; janfirst = 0; yearbeg = EPOCH_YEAR; do { - int32_t yearsecs + int_fast32_t yearsecs = year_lengths[isleap(yearbeg - 1)] * SECSPERDAY; + time_t janfirst1 = janfirst; yearbeg--; - if (increment_overflow_time(&janfirst, -yearsecs)) { + if (increment_overflow_time(&janfirst1, -yearsecs)) { janoffset = -yearsecs; break; } + janfirst = janfirst1; } while (atlo < janfirst && EPOCH_YEAR - YEARSPERREPEAT / 2 < yearbeg); while (true) { - int32_t yearsecs + int_fast32_t yearsecs = year_lengths[isleap(yearbeg)] * SECSPERDAY; int yearbeg1 = yearbeg; time_t janfirst1 = janfirst; @@ -1213,18 +1833,18 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) } yearlim = yearbeg; - if (increment_overflow(&yearlim, YEARSPERREPEAT + 1)) + if (increment_overflow(&yearlim, years_of_observations)) yearlim = INT_MAX; for (year = yearbeg; year < yearlim; year++) { - int32_t - starttime = transtime(year, &start, stdoffset), - endtime = transtime(year, &end, dstoffset); - int32_t + int_fast32_t + starttime = localtime_transtime(year, &start, stdoffset), + endtime = localtime_transtime(year, &end, dstoffset); + int_fast32_t yearsecs = (year_lengths[isleap(year)] * SECSPERDAY); bool reversed = endtime < starttime; if (reversed) { - int32_t swap = starttime; + int_fast32_t swap = starttime; starttime = endtime; endtime = swap; } @@ -1250,7 +1870,7 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) if (endtime < leaplo) { yearlim = year; if (increment_overflow(&yearlim, - YEARSPERREPEAT + 1)) + years_of_observations)) yearlim = INT_MAX; } if (increment_overflow_time @@ -1262,12 +1882,12 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) if (! timecnt) { sp->ttis[0] = sp->ttis[1]; sp->typecnt = 1; /* Perpetual DST. */ - } else if (YEARSPERREPEAT < year - yearbeg) + } else if (years_of_observations <= year - yearbeg) sp->goback = sp->goahead = true; } else { - register int32_t theirstdoffset; - register int32_t theirdstoffset; - register int32_t theiroffset; + register int_fast32_t theirstdoffset; + register int_fast32_t theirdstoffset; + register int_fast32_t theiroffset; register bool isdst; register int i; register int j; @@ -1321,8 +1941,8 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) /* ** Transitions from DST to DDST ** will effectively disappear since - ** POSIX provides for only one DST - ** offset. + ** POSIX.1-2017 provides for only one + ** DST offset. */ if (isdst && !sp->ttis[j].tt_ttisstd) { sp->ats[i] += dstoffset - @@ -1343,14 +1963,12 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) init_ttinfo(&sp->ttis[0], -stdoffset, false, 0); init_ttinfo(&sp->ttis[1], -dstoffset, true, stdlen + 1); sp->typecnt = 2; - sp->defaulttype = 0; } } else { dstlen = 0; sp->typecnt = 1; /* only standard time */ sp->timecnt = 0; init_ttinfo(&sp->ttis[0], -stdoffset, false, 0); - sp->defaulttype = 0; } sp->charcnt = charcnt; cp = sp->chars; @@ -1365,16 +1983,16 @@ localtime_tzparse(const char *name, struct state *sp, struct state *basep) } static void -gmtload(struct state *const sp) +localtime_gmtload(struct state *const sp) { - if (localtime_tzload(gmt, sp, true) != 0) - localtime_tzparse("GMT0", sp, NULL); + if (localtime_tzload(etc_utc, sp, true) != 0) + localtime_tzparse("UTC0", sp, NULL); } /* Initialize *SP to a value appropriate for the TZ setting NAME. Return 0 on success, an errno value on failure. */ static int -zoneinit(struct state *sp, char const *name) +localtime_zoneinit(struct state *sp, char const *name) { if (name && ! name[0]) { /* @@ -1386,22 +2004,21 @@ zoneinit(struct state *sp, char const *name) sp->charcnt = 0; sp->goback = sp->goahead = false; init_ttinfo(&sp->ttis[0], 0, false, 0); - strcpy(sp->chars, gmt); - sp->defaulttype = 0; + strcpy(sp->chars, utc); return 0; } else { int err = localtime_tzload(name, sp, true); - if (err != 0 && name && name[0] != ':' && - localtime_tzparse(name, sp, NULL)) + if (err != 0 && name && name[0] != ':' && localtime_tzparse(name, sp, NULL)) err = 0; if (err == 0) - scrub_abbrs(sp); + err = scrub_abbrs(sp); return err; } } static void -FreeLocaltime(void *p) { +localtime_lclptr_free(void *p) +{ free(p); } @@ -1415,13 +2032,15 @@ localtime_tzset_unlocked(void) ? lcl_is_set < 0 : 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0) return; - if (!sp) { +#ifdef ALL_STATE + if (! sp) { lclptr = sp = malloc(sizeof *lclptr); - __cxa_atexit(FreeLocaltime, sp, 0); + __cxa_atexit(localtime_lclptr_free, sp, 0); } +#endif /* defined ALL_STATE */ if (sp) { - if (zoneinit(sp, name) != 0) - zoneinit(sp, ""); + if (localtime_zoneinit(sp, name) != 0) + localtime_zoneinit(sp, ""); if (0 < lcl) strcpy(lcl_TZname, name); } @@ -1438,21 +2057,8 @@ tzset(void) } static void -gmtcheck(void) +localtime_gmtptr_free(void *p) { - static bool gmt_is_set; - localtime_lock(); - if (! gmt_is_set) { - gmtptr = malloc(sizeof *gmtptr); - if (gmtptr) - gmtload(gmtptr); - gmt_is_set = true; - } - localtime_unlock(); -} - -static void -FreeGmt(void *p) { free(p); } @@ -1462,10 +2068,12 @@ localtime_gmtcheck(void) static bool gmt_is_set; localtime_lock(); if (! gmt_is_set) { +#ifdef ALL_STATE gmtptr = malloc(sizeof *gmtptr); - __cxa_atexit(FreeGmt, gmtptr, 0); + __cxa_atexit(localtime_gmtptr_free, gmtptr, 0); +#endif if (gmtptr) - gmtload(gmtptr); + localtime_gmtload(gmtptr); gmt_is_set = true; } localtime_unlock(); @@ -1479,15 +2087,16 @@ localtime_gmtcheck(void) ** ** If successful and SETNAME is nonzero, ** set the applicable parts of tzname, timezone and altzone; -** however, it's OK to omit this step if the timezone is POSIX-compatible, +** however, it's OK to omit this step +** if the timezone is compatible with POSIX.1-2017 ** since in that case tzset should have already done this step correctly. -** SETNAME's type is int32_t for compatibility with gmtsub, +** SETNAME's type is int_fast32_t for compatibility with gmtsub, ** but it is actually a boolean and its value should be 0 or 1. */ /*ARGSUSED*/ static struct tm * -localsub(struct state const *sp, time_t const *timep, int32_t setname, +localsub(struct state const *sp, time_t const *timep, int_fast32_t setname, struct tm *const tmp) { register const struct ttinfo * ttisp; @@ -1525,7 +2134,15 @@ localsub(struct state const *sp, time_t const *timep, int32_t setname, return NULL; /* "cannot happen" */ result = localsub(sp, &newt, setname, tmp); if (result) { - register int64_t newy; +#if defined ckd_add && defined ckd_sub + if (t < sp->ats[0] + ? ckd_sub(&result->tm_year, + result->tm_year, years) + : ckd_add(&result->tm_year, + result->tm_year, years)) + return NULL; +#else + register int_fast64_t newy; newy = result->tm_year; if (t < sp->ats[0]) @@ -1534,11 +2151,12 @@ localsub(struct state const *sp, time_t const *timep, int32_t setname, if (! (INT_MIN <= newy && newy <= INT_MAX)) return NULL; result->tm_year = newy; +#endif } return result; } if (sp->timecnt == 0 || t < sp->ats[0]) { - i = sp->defaulttype; + i = 0; } else { register int lo = 1; register int hi = sp->timecnt; @@ -1559,12 +2177,14 @@ localsub(struct state const *sp, time_t const *timep, int32_t setname, ** t += ttisp->tt_utoff; ** timesub(&t, 0L, sp, tmp); */ - result = localtime_timesub(&t, ttisp->tt_utoff, sp, tmp); + result = timesub(&t, ttisp->tt_utoff, sp, tmp); if (result) { - result->tm_isdst = ttisp->tt_isdst; - result->tm_zone = (char *) &sp->chars[ttisp->tt_desigidx]; - if (setname) - update_tzname_etc(sp, ttisp); + result->tm_isdst = ttisp->tt_isdst; +#ifdef TM_ZONE + result->TM_ZONE = (char *) &sp->chars[ttisp->tt_desigidx]; +#endif /* defined TM_ZONE */ + if (setname) + update_tzname_etc(sp, ttisp); } return result; } @@ -1583,11 +2203,14 @@ localtime_tzset(time_t const *timep, struct tm *tmp, bool setname) struct tm * localtime(const time_t *timep) { +#if !SUPPORT_C89 + static struct tm tm; +#endif return localtime_tzset(timep, &tm, true); } struct tm * -localtime_r(const time_t *timep, struct tm *tmp) +localtime_r(const time_t *restrict timep, struct tm *restrict tmp) { return localtime_tzset(timep, tmp, false); } @@ -1597,43 +2220,41 @@ localtime_r(const time_t *timep, struct tm *tmp) */ static struct tm * -gmtsub(struct state const *sp, time_t const *timep, int32_t offset, - struct tm *tmp) +gmtsub(ATTRIBUTE_MAYBE_UNUSED struct state const *sp, time_t const *timep, + int_fast32_t offset, struct tm *tmp) { register struct tm * result; - result = localtime_timesub(timep, offset, gmtptr, tmp); + result = timesub(timep, offset, gmtptr, tmp); +#ifdef TM_ZONE /* ** Could get fancy here and deliver something such as ** "+xx" or "-xx" if offset is non-zero, ** but this is no time for a treasure hunt. */ - tmp->tm_zone = ((char *) - (offset ? wildabbr : gmtptr ? gmtptr->chars : gmt)); + tmp->TM_ZONE = ((char *) + (offset ? wildabbr : gmtptr ? gmtptr->chars : utc)); +#endif /* defined TM_ZONE */ return result; } /* -* Re-entrant version of gmtime. -*/ - -/** - * Converts UNIX timestamp to broken-down representation. + * Re-entrant version of gmtime. */ + struct tm * -gmtime_r(const time_t *timep, struct tm *tmp) +gmtime_r(time_t const *restrict timep, struct tm *restrict tmp) { localtime_gmtcheck(); return gmtsub(gmtptr, timep, 0, tmp); } -/** - * Converts UNIX timestamp to broken-down representation. - * @threadunsafe (see gmtime_r) - */ struct tm * gmtime(const time_t *timep) { +#if !SUPPORT_C89 + static struct tm tm; +#endif return gmtime_r(timep, &tm); } @@ -1657,15 +2278,15 @@ leaps_thru_end_of(time_t y) } static struct tm * -localtime_timesub(const time_t *timep, int32_t offset, - const struct state *sp, struct tm *tmp) +timesub(const time_t *timep, int_fast32_t offset, + const struct state *sp, struct tm *tmp) { register const struct lsinfo * lp; register time_t tdays; register const int * ip; - register int32_t corr; + register int_fast32_t corr; register int i; - int32_t idays, rem, dayoff, dayrem; + int_fast32_t idays, rem, dayoff, dayrem; time_t y; /* If less than SECSPERMIN, the number of seconds since the @@ -1711,7 +2332,7 @@ localtime_timesub(const time_t *timep, int32_t offset, /* Increase Y and decrease IDAYS until IDAYS is in range for Y. */ while (year_lengths[isleap(y)] <= idays) { int tdelta = idays / DAYSPERLYEAR; - int32_t ydelta = tdelta + !tdelta; + int_fast32_t ydelta = tdelta + !tdelta; time_t newy = y + ydelta; register int leapdays; leapdays = leaps_thru_end_of(newy - 1) - @@ -1721,6 +2342,12 @@ localtime_timesub(const time_t *timep, int32_t offset, y = newy; } +#ifdef ckd_add + if (ckd_add(&tmp->tm_year, y, -TM_YEAR_BASE)) { + errno = EOVERFLOW; + return NULL; + } +#else if (!TYPE_SIGNED(time_t) && y < TM_YEAR_BASE) { int signed_y = y; tmp->tm_year = signed_y - TM_YEAR_BASE; @@ -1731,6 +2358,7 @@ localtime_timesub(const time_t *timep, int32_t offset, errno = EOVERFLOW; return NULL; } +#endif tmp->tm_yday = idays; /* ** The "extra" mods below avoid overflow problems. @@ -1758,7 +2386,9 @@ localtime_timesub(const time_t *timep, int32_t offset, idays -= ip[tmp->tm_mon]; tmp->tm_mday = idays + 1; tmp->tm_isdst = 0; - tmp->tm_gmtoff = offset; +#ifdef TM_GMTOFF + tmp->TM_GMTOFF = offset; +#endif /* defined TM_GMTOFF */ return tmp; } @@ -1772,7 +2402,7 @@ localtime_timesub(const time_t *timep, int32_t offset, */ #ifndef WRONG -#define WRONG (-1) +# define WRONG (-1) #endif /* !defined WRONG */ /* @@ -1782,13 +2412,11 @@ localtime_timesub(const time_t *timep, int32_t offset, forceinline bool increment_overflow(int *ip, int j) { -#if defined(__GNUC__) && __GNUC__ >= 6 - int i = *ip; - if (__builtin_add_overflow(i, j, &i)) return true; - *ip = i; - return false; +#ifdef ckd_add + return ckd_add(ip, *ip, j); #else register int const i = *ip; + /* ** If i >= 0 there can only be overflow if i + j > INT_MAX ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow. @@ -1803,16 +2431,14 @@ increment_overflow(int *ip, int j) } forceinline bool -increment_overflow32(int32_t *const lp, int const m) +increment_overflow32(int_fast32_t *const lp, int const m) { -#if defined(__GNUC__) && __GNUC__ >= 6 - int32_t i = *lp; - if (__builtin_add_overflow(i, m, &i)) return true; - *lp = i; - return false; +#ifdef ckd_add + return ckd_add(lp, *lp, m); #else - register int32_t const l = *lp; - if ((l >= 0) ? (m > INT32_MAX - l) : (m < INT32_MIN - l)) + register int_fast32_t const l = *lp; + + if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l)) return true; *lp += m; return false; @@ -1820,13 +2446,10 @@ increment_overflow32(int32_t *const lp, int const m) } forceinline bool -increment_overflow_time(time_t *tp, int32_t j) +increment_overflow_time(time_t *tp, int_fast32_t j) { -#if defined(__GNUC__) && __GNUC__ >= 6 - time_t i = *tp; - if (__builtin_add_overflow(i, j, &i)) return true; - *tp = i; - return false; +#ifdef ckd_add + return ckd_add(tp, *tp, j); #else /* ** This is like @@ -1855,7 +2478,7 @@ normalize_overflow(int *const tensptr, int *const unitsptr, const int base) } static bool -normalize_overflow32(int32_t *tensptr, int *unitsptr, int base) +normalize_overflow32(int_fast32_t *tensptr, int *unitsptr, int base) { register int tensdelta; @@ -1882,29 +2505,46 @@ tmcomp(register const struct tm *const atmp, return result; } +/* Copy to *DEST from *SRC. Copy only the members needed for mktime, + as other members might not be initialized. */ +static void +mktmcpy(struct tm *dest, struct tm const *src) +{ + dest->tm_sec = src->tm_sec; + dest->tm_min = src->tm_min; + dest->tm_hour = src->tm_hour; + dest->tm_mday = src->tm_mday; + dest->tm_mon = src->tm_mon; + dest->tm_year = src->tm_year; + dest->tm_isdst = src->tm_isdst; +#if defined TM_GMTOFF && ! UNINIT_TRAP + dest->TM_GMTOFF = src->TM_GMTOFF; +#endif +} + static time_t -localtime_time2sub( - struct tm *const tmp, - struct tm *(*funcp)(struct state const *, time_t const *, - int32_t, struct tm *), - struct state const *sp, - const int32_t offset, - bool *okayp, - bool do_norm_secs) +time2sub(struct tm *const tmp, + struct tm *(*funcp)(struct state const *, time_t const *, + int_fast32_t, struct tm *), + struct state const *sp, + const int_fast32_t offset, + bool *okayp, + bool do_norm_secs) { register int dir; register int i, j; register int saved_seconds; - register int32_t li; + register int_fast32_t li; register time_t lo; register time_t hi; - int32_t y; + int_fast32_t y; time_t newt; time_t t; struct tm yourtm, mytm; *okayp = false; - yourtm = *tmp; + mktmcpy(&yourtm, tmp); + if (do_norm_secs) { if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec, SECSPERMIN)) @@ -1946,14 +2586,19 @@ localtime_time2sub( return WRONG; } } +#ifdef ckd_add + if (ckd_add(&yourtm.tm_year, y, -TM_YEAR_BASE)) + return WRONG; +#else if (increment_overflow32(&y, -TM_YEAR_BASE)) return WRONG; if (! (INT_MIN <= y && y <= INT_MAX)) return WRONG; yourtm.tm_year = y; +#endif if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN) saved_seconds = 0; - else if (y + TM_YEAR_BASE < EPOCH_YEAR) { + else if (yourtm.tm_year < EPOCH_YEAR - TM_YEAR_BASE) { /* ** We can't set tm_sec to 0, because that might push the ** time below the minimum representable time. @@ -2013,10 +2658,10 @@ localtime_time2sub( && (yourtm.TM_GMTOFF < 0 ? (-SECSPERDAY <= yourtm.TM_GMTOFF && (mytm.TM_GMTOFF <= - (SMALLEST(INT32_MAX, LONG_MAX) + (min(INT_FAST32_MAX, LONG_MAX) + yourtm.TM_GMTOFF))) : (yourtm.TM_GMTOFF <= SECSPERDAY - && ((BIGGEST(INT32_MIN, LONG_MIN) + && ((max(INT_FAST32_MIN, LONG_MIN) + yourtm.TM_GMTOFF) <= mytm.TM_GMTOFF)))) { /* MYTM matches YOURTM except with the wrong UT offset. @@ -2024,7 +2669,7 @@ localtime_time2sub( It's OK if YOURTM.TM_GMTOFF contains uninitialized data, since the guess gets checked. */ time_t altt = t; - int32_t diff = mytm.TM_GMTOFF - yourtm.TM_GMTOFF; + int_fast32_t diff = mytm.TM_GMTOFF - yourtm.TM_GMTOFF; if (!increment_overflow_time(&altt, diff)) { struct tm alttm; if (funcp(sp, &altt, offset, &alttm) @@ -2083,13 +2728,12 @@ label: } static time_t -localtime_time2( - struct tm * const tmp, - struct tm *(*funcp)(struct state const *, time_t const *, - int32_t, struct tm *), - struct state const *sp, - const int32_t offset, - bool *okayp) +time2(struct tm * const tmp, + struct tm *(*funcp)(struct state const *, time_t const *, + int_fast32_t, struct tm *), + struct state const *sp, + const int_fast32_t offset, + bool *okayp) { time_t t; @@ -2098,17 +2742,16 @@ localtime_time2( ** (in case tm_sec contains a value associated with a leap second). ** If that fails, try with normalization of seconds. */ - t = localtime_time2sub(tmp, funcp, sp, offset, okayp, false); - return *okayp ? t : localtime_time2sub(tmp,funcp,sp,offset,okayp,true); + t = time2sub(tmp, funcp, sp, offset, okayp, false); + return *okayp ? t : time2sub(tmp, funcp, sp, offset, okayp, true); } static time_t -localtime_time1( - struct tm *const tmp, - struct tm *(*funcp)(struct state const *, time_t const *, - int32_t, struct tm *), - struct state const *sp, - const int32_t offset) +time1(struct tm *const tmp, + struct tm *(*funcp)(struct state const *, time_t const *, + int_fast32_t, struct tm *), + struct state const *sp, + const int_fast32_t offset) { register time_t t; register int samei, otheri; @@ -2125,7 +2768,7 @@ localtime_time1( } if (tmp->tm_isdst > 1) tmp->tm_isdst = 1; - t = localtime_time2(tmp, funcp, sp, offset, &okay); + t = time2(tmp, funcp, sp, offset, &okay); if (okay) return t; if (tmp->tm_isdst < 0) @@ -2164,7 +2807,7 @@ localtime_time1( tmp->tm_sec += (sp->ttis[otheri].tt_utoff - sp->ttis[samei].tt_utoff); tmp->tm_isdst = !tmp->tm_isdst; - t = localtime_time2(tmp, funcp, sp, offset, &okay); + t = time2(tmp, funcp, sp, offset, &okay); if (okay) return t; tmp->tm_sec -= (sp->ttis[otheri].tt_utoff @@ -2179,10 +2822,10 @@ static time_t mktime_tzname(struct state *sp, struct tm *tmp, bool setname) { if (sp) - return localtime_time1(tmp, localsub, sp, setname); + return time1(tmp, localsub, sp, setname); else { localtime_gmtcheck(); - return localtime_time1(tmp, gmtsub, gmtptr, 0); + return time1(tmp, gmtsub, gmtptr, 0); } } @@ -2197,6 +2840,8 @@ mktime(struct tm *tmp) return t; } +/* This function is obsolescent and may disapper in future releases. + Callers can instead use mktime. */ time_t timelocal(struct tm *tmp) { @@ -2205,22 +2850,31 @@ timelocal(struct tm *tmp) return mktime(tmp); } -time_t -timegm(struct tm *tmp) -{ - return timeoff(tmp, 0); -} - +/* This function is obsolescent and may disapper in future releases. + Callers can instead use mktime_z with a fixed-offset zone. */ time_t timeoff(struct tm *tmp, long offset) { if (tmp) tmp->tm_isdst = 0; - gmtcheck(); - return localtime_time1(tmp, gmtsub, gmtptr, offset); + localtime_gmtcheck(); + return time1(tmp, gmtsub, gmtptr, offset); } -static int32_t +time_t +timegm(struct tm *tmp) +{ + time_t t; + struct tm tmcpy; + mktmcpy(&tmcpy, tmp); + tmcpy.tm_wday = -1; + t = timeoff(&tmcpy, 0); + if (0 <= tmcpy.tm_wday) + *tmp = tmcpy; + return t; +} + +static int_fast32_t leapcorr(struct state const *sp, time_t t) { register struct lsinfo const * lp; diff --git a/third_party/tz/private.h b/third_party/tz/private.h new file mode 100644 index 000000000..f2a79cdf8 --- /dev/null +++ b/third_party/tz/private.h @@ -0,0 +1,165 @@ +#ifndef TZ_PRIVATE_H +#define TZ_PRIVATE_H +#include "libc/errno.h" +#include "libc/calls/weirdtypes.h" +#include "libc/time.h" +#include "libc/limits.h" + +#define ALL_STATE +#define HAVE_TZNAME 1 +#define HAVE_MALLOC_ERRNO 1 +#define TM_ZONE tm_zone +#define TM_GMTOFF tm_gmtoff + +/* The maximum size of any created object, as a signed integer. + Although the C standard does not outright prohibit larger objects, + behavior is undefined if the result of pointer subtraction does not + fit into ptrdiff_t, and the code assumes in several places that + pointer subtraction works. As a practical matter it's OK to not + support objects larger than this. */ +#define INDEX_MAX ((ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX)) + +#define ATTRIBUTE_MALLOC __attribute__((__malloc__)) +#define ATTRIBUTE_FORMAT(spec) __attribute__((__format__ spec)) +#define ATTRIBUTE_FALLTHROUGH __attribute__((__fallthrough__)) +#define ATTRIBUTE_MAYBE_UNUSED __attribute__((__unused__)) +#define ATTRIBUTE_NORETURN __attribute__((__noreturn__)) +#define ATTRIBUTE_REPRODUCIBLE __attribute__((__pure__)) +#define ATTRIBUTE_UNSEQUENCED __attribute__((__const__)) + +#define unreachable() __builtin_unreachable() + +/* +** Finally, some convenience items. +*/ + +#define TYPE_BIT(type) (CHAR_BIT * (ptrdiff_t)sizeof(type)) +#define TYPE_SIGNED(type) (((type) - 1) < 0) +#define TWOS_COMPLEMENT(t) ((t) ~(t)0 < 0) + +/* Minimum and maximum of two values. Use lower case to avoid + naming clashes with standard include files. */ +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min(a, b) ((a) < (b) ? (a) : (b)) + +/* Max and min values of the integer type T, of which only the bottom + B bits are used, and where the highest-order used bit is considered + to be a sign bit if T is signed. */ +#define MAXVAL(t, b) \ + ((t)(((t)1 << ((b) - 1 - TYPE_SIGNED(t))) - 1 + \ + ((t)1 << ((b) - 1 - TYPE_SIGNED(t))))) +#define MINVAL(t, b) \ + ((t)(TYPE_SIGNED(t) ? -TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0)) + +/* The extreme time values, assuming no padding. */ +#define TIME_T_MIN_NO_PADDING MINVAL(time_t, TYPE_BIT(time_t)) +#define TIME_T_MAX_NO_PADDING MAXVAL(time_t, TYPE_BIT(time_t)) + +/* +** 302 / 1000 is log10(2.0) rounded up. +** Subtract one for the sign bit if the type is signed; +** add one for integer division truncation; +** add one more for a minus sign if the type is signed. +*/ +#define INT_STRLEN_MAXIMUM(type) \ + ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type)) + +/* +** INITIALIZE(x) +*/ + +/* Whether memory access must strictly follow the C standard. + If 0, it's OK to read uninitialized storage so long as the value is + not relied upon. Defining it to 0 lets mktime access parts of + struct tm that might be uninitialized, as a heuristic when the + standard doesn't say what to return and when tm_gmtoff can help + mktime likely infer a better value. */ +#ifndef UNINIT_TRAP +#define UNINIT_TRAP 0 +#endif + +#if !defined TZ_DOMAIN && defined HAVE_GETTEXT +#define TZ_DOMAIN "tz" +#endif + +/* Handy macros that are independent of tzfile implementation. */ + +enum { + SECSPERMIN = 60, + MINSPERHOUR = 60, + SECSPERHOUR = SECSPERMIN * MINSPERHOUR, + HOURSPERDAY = 24, + DAYSPERWEEK = 7, + DAYSPERNYEAR = 365, + DAYSPERLYEAR = DAYSPERNYEAR + 1, + MONSPERYEAR = 12, + YEARSPERREPEAT = 400 /* years before a Gregorian repeat */ +}; + +#define SECSPERDAY ((int_fast32_t)SECSPERHOUR * HOURSPERDAY) + +#define DAYSPERREPEAT ((int_fast32_t)400 * 365 + 100 - 4 + 1) +#define SECSPERREPEAT ((int_fast64_t)DAYSPERREPEAT * SECSPERDAY) +#define AVGSECSPERYEAR (SECSPERREPEAT / YEARSPERREPEAT) + +/* How many years to generate (in zic.c) or search through (in localtime.c). + This is two years larger than the obvious 400, to avoid edge cases. + E.g., suppose a non-POSIX.1-2017 rule applies from 2012 on with transitions + in March and September, plus one-off transitions in November 2013. + If zic looked only at the last 400 years, it would set max_year=2413, + with the intent that the 400 years 2014 through 2413 will be repeated. + The last transition listed in the tzfile would be in 2413-09, + less than 400 years after the last one-off transition in 2013-11. + Two years is not overkill for localtime.c, as a one-year bump + would mishandle 2023d's America/Ciudad_Juarez for November 2422. */ +enum { years_of_observations = YEARSPERREPEAT + 2 }; + +enum { + TM_SUNDAY, + TM_MONDAY, + TM_TUESDAY, + TM_WEDNESDAY, + TM_THURSDAY, + TM_FRIDAY, + TM_SATURDAY +}; + +enum { + TM_JANUARY, + TM_FEBRUARY, + TM_MARCH, + TM_APRIL, + TM_MAY, + TM_JUNE, + TM_JULY, + TM_AUGUST, + TM_SEPTEMBER, + TM_OCTOBER, + TM_NOVEMBER, + TM_DECEMBER +}; + +enum { + TM_YEAR_BASE = 1900, + TM_WDAY_BASE = TM_MONDAY, + EPOCH_YEAR = 1970, + EPOCH_WDAY = TM_THURSDAY +}; + +#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) + +/* +** Since everything in isleap is modulo 400 (or a factor of 400), we know that +** isleap(y) == isleap(y % 400) +** and so +** isleap(a + b) == isleap((a + b) % 400) +** or +** isleap(a + b) == isleap(a % 400 + b % 400) +** This is true even if % means modulo rather than Fortran remainder +** (which is allowed by C89 but not by C99 or later). +** We use this to avoid addition overflow problems. +*/ + +#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400) + +#endif /* !defined TZ_PRIVATE_H */ diff --git a/libc/time/strftime.c b/third_party/tz/strftime.c similarity index 64% rename from libc/time/strftime.c rename to third_party/tz/strftime.c index 1a607b35e..372b98071 100644 --- a/libc/time/strftime.c +++ b/third_party/tz/strftime.c @@ -1,4 +1,4 @@ -/*-*- mode:c; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ │ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ ╞══════════════════════════════════════════════════════════════════════════════╡ │ Copyright (c) 1989 The Regents of the University of California. │ @@ -16,24 +16,19 @@ │ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED │ │ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/inttypes.h" -#include "libc/stdio/stdio.h" #include "libc/str/locale.h" -#include "libc/time/time.h" -#include "libc/time/tz.internal.h" -// clang-format off -// converts broken-down timestamp to string - -#define DIVISOR 100 +#include "libc/time.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/inttypes.h" +#include "private.h" __notice(strftime_notice, "strftime (BSD-3)\n\ Copyright 1989 The Regents of the University of California"); -/* -** Based on the UCB version with the copyright notice appearing above. -** -** This is ANSIish only when "multibyte character == plain character". -*/ +#ifndef DEPRECATE_TWO_DIGIT_YEARS +# define DEPRECATE_TWO_DIGIT_YEARS false +#endif struct lc_time_T { const char * mon[MONSPERYEAR]; @@ -48,8 +43,6 @@ struct lc_time_T { const char * date_fmt; }; -#define Locale (&C_time_locale) - static const struct lc_time_T C_time_locale = { { "Jan", "Feb", "Mar", "Apr", "May", "Jun", @@ -99,11 +92,11 @@ static const struct lc_time_T C_time_locale = { enum warn { IN_NONE, IN_SOME, IN_THIS, IN_ALL }; #ifndef YEAR_2000_NAME -#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS" +# define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS" #endif /* !defined YEAR_2000_NAME */ static char * -strftime_add(const char *str, char *pt, const char *ptlim) +_add(const char *str, char *pt, const char *ptlim) { while (pt < ptlim && (*pt = *str++) != '\0') ++pt; @@ -111,11 +104,12 @@ strftime_add(const char *str, char *pt, const char *ptlim) } static char * -strftime_conv(int n, const char *format, char *pt, const char *ptlim) +_conv(int n, const char *format, char *pt, const char *ptlim) { char buf[INT_STRLEN_MAXIMUM(int) + 1]; - (sprintf)(buf, format, n); - return strftime_add(buf, pt, ptlim); + + sprintf(buf, format, n); + return _add(buf, pt, ptlim); } /* @@ -127,17 +121,13 @@ strftime_conv(int n, const char *format, char *pt, const char *ptlim) */ static char * -strftime_yconv( - int a, - int b, - bool convert_top, - bool convert_yy, - char *pt, - const char *ptlim) +_yconv(int a, int b, bool convert_top, bool convert_yy, + char *pt, const char *ptlim) { register int lead; register int trail; + int DIVISOR = 100; trail = a % DIVISOR + b % DIVISOR; lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR; trail %= DIVISOR; @@ -150,18 +140,20 @@ strftime_yconv( } if (convert_top) { if (lead == 0 && trail < 0) - pt = strftime_add("-0", pt, ptlim); - else pt = strftime_conv(lead, "%02d", pt, ptlim); + pt = _add("-0", pt, ptlim); + else pt = _conv(lead, "%02d", pt, ptlim); } if (convert_yy) - pt = strftime_conv(((trail < 0) ? -trail : trail), "%02d", pt, ptlim); + pt = _conv(((trail < 0) ? -trail : trail), "%02d", pt, ptlim); return pt; } static char * -strftime_fmt(const char *format, const struct tm *t, char *pt, - const char *ptlim, enum warn *warnp) +_fmt(const char *format, const struct tm *t, char *pt, + const char *ptlim, enum warn *warnp) { + struct lc_time_T const *Locale = &C_time_locale; + for ( ; *format; ++format) { if (*format == '%') { label: @@ -170,31 +162,27 @@ label: --format; break; case 'A': - pt = strftime_add( - (t->tm_wday < 0 || + pt = _add((t->tm_wday < 0 || t->tm_wday >= DAYSPERWEEK) ? "?" : Locale->weekday[t->tm_wday], pt, ptlim); continue; case 'a': - pt = strftime_add( - (t->tm_wday < 0 || - t->tm_wday >= DAYSPERWEEK) ? + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? "?" : Locale->wday[t->tm_wday], pt, ptlim); continue; case 'B': - pt = strftime_add( - (t->tm_mon < 0 || - t->tm_mon >= MONSPERYEAR) ? + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? "?" : Locale->month[t->tm_mon], pt, ptlim); continue; case 'b': case 'h': - pt = strftime_add( - (t->tm_mon < 0 || - t->tm_mon >= MONSPERYEAR) ? + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? "?" : Locale->mon[t->tm_mon], pt, ptlim); continue; @@ -206,14 +194,14 @@ label: ** something completely different. ** (ado, 1993-05-24) */ - pt = strftime_yconv(t->tm_year, TM_YEAR_BASE, - true, false, pt, ptlim); + pt = _yconv(t->tm_year, TM_YEAR_BASE, + true, false, pt, ptlim); continue; case 'c': { enum warn warn2 = IN_SOME; - pt = strftime_fmt(Locale->c_fmt, t, pt, ptlim, &warn2); + pt = _fmt(Locale->c_fmt, t, pt, ptlim, &warn2); if (warn2 == IN_ALL) warn2 = IN_THIS; if (warn2 > *warnp) @@ -221,10 +209,10 @@ label: } continue; case 'D': - pt = strftime_fmt("%m/%d/%y", t, pt, ptlim, warnp); + pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp); continue; case 'd': - pt = strftime_conv(t->tm_mday, "%02d", pt, ptlim); + pt = _conv(t->tm_mday, "%02d", pt, ptlim); continue; case 'E': case 'O': @@ -239,21 +227,21 @@ label: */ goto label; case 'e': - pt = strftime_conv(t->tm_mday, "%2d", pt, ptlim); + pt = _conv(t->tm_mday, "%2d", pt, ptlim); continue; case 'F': - pt = strftime_fmt("%Y-%m-%d", t, pt, ptlim, warnp); + pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp); continue; case 'H': - pt = strftime_conv(t->tm_hour, "%02d", pt, ptlim); + pt = _conv(t->tm_hour, "%02d", pt, ptlim); continue; case 'I': - pt = strftime_conv((t->tm_hour % 12) ? - (t->tm_hour % 12) : 12, - "%02d", pt, ptlim); + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%02d", pt, ptlim); continue; case 'j': - pt = strftime_conv(t->tm_yday + 1, "%03d", pt, ptlim); + pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim); continue; case 'k': /* @@ -266,15 +254,14 @@ label: ** "%l" have been swapped. ** (ado, 1993-05-24) */ - pt = strftime_conv(t->tm_hour, "%2d", - pt, ptlim); + pt = _conv(t->tm_hour, "%2d", pt, ptlim); continue; #ifdef KITCHEN_SINK case 'K': /* ** After all this time, still unclaimed! */ - pt = strftime_add("kitchen sink", pt, ptlim); + pt = _add("kitchen sink", pt, ptlim); continue; #endif /* defined KITCHEN_SINK */ case 'l': @@ -287,38 +274,33 @@ label: ** "%l" have been swapped. ** (ado, 1993-05-24) */ - pt = strftime_conv((t->tm_hour % 12) ? - (t->tm_hour % 12) : 12, - "%2d", pt, ptlim); + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%2d", pt, ptlim); continue; case 'M': - pt = strftime_conv(t->tm_min, "%02d", - pt, ptlim); + pt = _conv(t->tm_min, "%02d", pt, ptlim); continue; case 'm': - pt = strftime_conv(t->tm_mon + 1, "%02d", - pt, ptlim); + pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim); continue; case 'n': - pt = strftime_add("\n", pt, ptlim); + pt = _add("\n", pt, ptlim); continue; case 'p': - pt = strftime_add( - (t->tm_hour >= (HOURSPERDAY / 2)) ? + pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ? Locale->pm : Locale->am, pt, ptlim); continue; case 'R': - pt = strftime_fmt("%H:%M", t, pt, ptlim, warnp); + pt = _fmt("%H:%M", t, pt, ptlim, warnp); continue; case 'r': - pt = strftime_fmt("%I:%M:%S %p", t, pt, - ptlim, warnp); + pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp); continue; case 'S': - pt = strftime_conv(t->tm_sec, "%02d", pt, - ptlim); + pt = _conv(t->tm_sec, "%02d", pt, ptlim); continue; case 's': { @@ -327,42 +309,42 @@ label: time_t) + 1]; time_t mkt; - tm = *t; - tm.tm_yday = -1; + tm.tm_sec = t->tm_sec; + tm.tm_min = t->tm_min; + tm.tm_hour = t->tm_hour; + tm.tm_mday = t->tm_mday; + tm.tm_mon = t->tm_mon; + tm.tm_year = t->tm_year; +#ifdef TM_GMTOFF + mkt = timeoff(&tm, t->TM_GMTOFF); +#else + tm.tm_isdst = t->tm_isdst; mkt = mktime(&tm); - if (mkt == (time_t) -1) { - /* Fail unless this -1 represents - a valid time. */ - struct tm tm_1; - if (!localtime_r(&mkt, &tm_1)) - return NULL; - if (!(tm.tm_year == tm_1.tm_year - && tm.tm_yday == tm_1.tm_yday - && tm.tm_hour == tm_1.tm_hour - && tm.tm_min == tm_1.tm_min - && tm.tm_sec == tm_1.tm_sec)) - return NULL; - } +#endif + /* If mktime fails, %s expands to the + value of (time_t) -1 as a failure + marker; this is better in practice + than strftime failing. */ if (TYPE_SIGNED(time_t)) { intmax_t n = mkt; - (sprintf)(buf, "%"PRIdMAX, n); + sprintf(buf, "%"PRIdMAX, n); } else { uintmax_t n = mkt; - (sprintf)(buf, "%"PRIuMAX, n); + sprintf(buf, "%"PRIuMAX, n); } - pt = strftime_add(buf, pt, ptlim); + pt = _add(buf, pt, ptlim); } continue; case 'T': - pt = strftime_fmt("%H:%M:%S", t, pt, ptlim, warnp); + pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp); continue; case 't': - pt = strftime_add("\t", pt, ptlim); + pt = _add("\t", pt, ptlim); continue; case 'U': - pt = strftime_conv((t->tm_yday + DAYSPERWEEK - - t->tm_wday) / DAYSPERWEEK, - "%02d", pt, ptlim); + pt = _conv((t->tm_yday + DAYSPERWEEK - + t->tm_wday) / DAYSPERWEEK, + "%02d", pt, ptlim); continue; case 'u': /* @@ -371,9 +353,9 @@ label: ** [1 (Monday) - 7]" ** (ado, 1993-05-24) */ - pt = strftime_conv((t->tm_wday == 0) ? - DAYSPERWEEK : t->tm_wday, - "%d", pt, ptlim); + pt = _conv((t->tm_wday == 0) ? + DAYSPERWEEK : t->tm_wday, + "%d", pt, ptlim); continue; case 'V': /* ISO 8601 week number */ case 'G': /* ISO 8601 year (four digits) */ @@ -445,17 +427,24 @@ label: DAYSPERLYEAR : DAYSPERNYEAR; } +#ifdef XPG4_1994_04_09 + if ((w == 52 && + t->tm_mon == TM_JANUARY) || + (w == 1 && + t->tm_mon == TM_DECEMBER)) + w = 53; +#endif /* defined XPG4_1994_04_09 */ if (*format == 'V') - pt = strftime_conv(w, "%02d", - pt, ptlim); + pt = _conv(w, "%02d", + pt, ptlim); else if (*format == 'g') { *warnp = IN_ALL; - pt = strftime_yconv(year, base, - false, true, - pt, ptlim); - } else pt = strftime_yconv(year, base, - true, true, - pt, ptlim); + pt = _yconv(year, base, + false, true, + pt, ptlim); + } else pt = _yconv(year, base, + true, true, + pt, ptlim); } continue; case 'v': @@ -464,27 +453,26 @@ label: ** "date as dd-bbb-YYYY" ** (ado, 1993-05-24) */ - pt = strftime_fmt("%e-%b-%Y", t, pt, ptlim, warnp); + pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp); continue; case 'W': - pt = strftime_conv( - (t->tm_yday + DAYSPERWEEK - - (t->tm_wday ? - (t->tm_wday - 1) : - (DAYSPERWEEK - 1))) / DAYSPERWEEK, + pt = _conv((t->tm_yday + DAYSPERWEEK - + (t->tm_wday ? + (t->tm_wday - 1) : + (DAYSPERWEEK - 1))) / DAYSPERWEEK, "%02d", pt, ptlim); continue; case 'w': - pt = strftime_conv(t->tm_wday, "%d", pt, ptlim); + pt = _conv(t->tm_wday, "%d", pt, ptlim); continue; case 'X': - pt = strftime_fmt(Locale->X_fmt, t, pt, ptlim, warnp); + pt = _fmt(Locale->X_fmt, t, pt, ptlim, warnp); continue; case 'x': { enum warn warn2 = IN_SOME; - pt = strftime_fmt(Locale->x_fmt, t, pt, ptlim, &warn2); + pt = _fmt(Locale->x_fmt, t, pt, ptlim, &warn2); if (warn2 == IN_ALL) warn2 = IN_THIS; if (warn2 > *warnp) @@ -493,17 +481,23 @@ label: continue; case 'y': *warnp = IN_ALL; - pt = strftime_yconv(t->tm_year, TM_YEAR_BASE, - false, true, - pt, ptlim); + pt = _yconv(t->tm_year, TM_YEAR_BASE, + false, true, + pt, ptlim); continue; case 'Y': - pt = strftime_yconv(t->tm_year, TM_YEAR_BASE, - true, true, - pt, ptlim); + pt = _yconv(t->tm_year, TM_YEAR_BASE, + true, true, + pt, ptlim); continue; case 'Z': - pt = strftime_add(t->tm_zone, pt, ptlim); +#ifdef TM_ZONE + pt = _add(t->TM_ZONE, pt, ptlim); +#elif HAVE_TZNAME + if (t->tm_isdst >= 0) + pt = _add(tzname[t->tm_isdst != 0], + pt, ptlim); +#endif /* ** C99 and later say that %Z must be ** replaced by the empty string if the @@ -512,30 +506,76 @@ label: */ continue; case 'z': +#if defined TM_GMTOFF || USG_COMPAT || ALTZONE { long diff; char const * sign; bool negative; - diff = t->tm_gmtoff; +# ifdef TM_GMTOFF + diff = t->TM_GMTOFF; +# else + /* + ** C99 and later say that the UT offset must + ** be computed by looking only at + ** tm_isdst. This requirement is + ** incorrect, since it means the code + ** must rely on magic (in this case + ** altzone and timezone), and the + ** magic might not have the correct + ** offset. Doing things correctly is + ** tricky and requires disobeying the standard; + ** see GNU C strftime for details. + ** For now, punt and conform to the + ** standard, even though it's incorrect. + ** + ** C99 and later say that %z must be replaced by + ** the empty string if the time zone is not + ** determinable, so output nothing if the + ** appropriate variables are not available. + */ + if (t->tm_isdst < 0) + continue; + if (t->tm_isdst == 0) +# if USG_COMPAT + diff = -timezone; +# else + continue; +# endif + else +# if ALTZONE + diff = -altzone; +# else + continue; +# endif +# endif negative = diff < 0; if (diff == 0) { - negative = t->tm_zone[0] == '-'; +# ifdef TM_ZONE + negative = t->TM_ZONE[0] == '-'; +# else + negative = t->tm_isdst < 0; +# if HAVE_TZNAME + if (tzname[t->tm_isdst != 0][0] == '-') + negative = true; +# endif +# endif } if (negative) { sign = "-"; diff = -diff; } else sign = "+"; - pt = strftime_add(sign, pt, ptlim); + pt = _add(sign, pt, ptlim); diff /= SECSPERMIN; diff = (diff / MINSPERHOUR) * 100 + (diff % MINSPERHOUR); - pt = strftime_conv(diff, "%04d", pt, ptlim); + pt = _conv(diff, "%04d", pt, ptlim); } +#endif continue; case '+': - pt = strftime_fmt(Locale->date_fmt, t, pt, - ptlim, warnp); + pt = _fmt(Locale->date_fmt, t, pt, ptlim, + warnp); continue; case '%': /* @@ -569,18 +609,31 @@ label: * @see FormatHttpDateTime() */ size_t -strftime(char *s, size_t maxsize, const char *format, const struct tm *t) +strftime(char *restrict s, size_t maxsize, char const *restrict format, + struct tm const *restrict t) { char * p; int saved_errno = errno; enum warn warn = IN_NONE; tzset(); - p = strftime_fmt(format, t, s, s + maxsize, &warn); + p = _fmt(format, t, s, s + maxsize, &warn); if (!p) { errno = EOVERFLOW; return 0; } + if (DEPRECATE_TWO_DIGIT_YEARS + && warn != IN_NONE && getenv(YEAR_2000_NAME)) { + fprintf(stderr, "\n"); + fprintf(stderr, "strftime format \"%s\" ", format); + fprintf(stderr, "yields only two digits of years in "); + if (warn == IN_SOME) + fprintf(stderr, "some locales"); + else if (warn == IN_THIS) + fprintf(stderr, "the current locale"); + else fprintf(stderr, "all locales"); + fprintf(stderr, "\n"); + } if (p == s + maxsize) { errno = ERANGE; return 0; @@ -590,10 +643,4 @@ strftime(char *s, size_t maxsize, const char *format, const struct tm *t) return p - s; } -size_t -strftime_l(char *s, size_t maxsize, char const *format, struct tm const *t, - locale_t locale) -{ - /* Just call strftime, as only the C locale is supported. */ - return strftime(s, maxsize, format, t); -} +__weak_reference(strftime, strftime_l); diff --git a/third_party/tz/timezone.c b/third_party/tz/timezone.c new file mode 100644 index 000000000..64f726074 --- /dev/null +++ b/third_party/tz/timezone.c @@ -0,0 +1,6 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/time.h" + +long timezone; diff --git a/third_party/tz/tzdir.h b/third_party/tz/tzdir.h new file mode 100644 index 000000000..4d5a701f6 --- /dev/null +++ b/third_party/tz/tzdir.h @@ -0,0 +1,6 @@ +#ifndef TZDEFAULT +#define TZDEFAULT "/etc/localtime" /* default zone */ +#endif +#ifndef TZDIR +#define TZDIR "/zip/usr/share/zoneinfo" /* TZif directory */ +#endif diff --git a/libc/time/tzfile.internal.h b/third_party/tz/tzfile.h similarity index 81% rename from libc/time/tzfile.internal.h rename to third_party/tz/tzfile.h index abab9923d..3155010ed 100644 --- a/libc/time/tzfile.internal.h +++ b/third_party/tz/tzfile.h @@ -1,8 +1,9 @@ -#ifndef TZFILE_H -#define TZFILE_H -/* clang-format off */ /* Layout and location of TZif files. */ +#ifndef TZFILE_H + +#define TZFILE_H + /* ** This file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson. @@ -20,16 +21,8 @@ ** Information about time zone files. */ -#ifndef TZDIR -#define TZDIR "/zip/usr/share/zoneinfo" /* Time zone object file directory */ -#endif /* !defined TZDIR */ - -#ifndef TZDEFAULT -#define TZDEFAULT "/etc/localtime" -#endif /* !defined TZDEFAULT */ - #ifndef TZDEFRULES -#define TZDEFRULES "US/Pacific" +# define TZDEFRULES "posixrules" #endif /* !defined TZDEFRULES */ @@ -85,11 +78,11 @@ struct tzhead { ** time uses 8 rather than 4 chars, ** then a POSIX-TZ-environment-variable-style string for use in handling ** instants after the last transition time stored in the file -** (with nothing between the newlines if there is no POSIX representation for -** such instants). +** (with nothing between the newlines if there is no POSIX.1-2017 +** representation for such instants). ** ** If tz_version is '3' or greater, the above is extended as follows. -** First, the POSIX TZ string's hour offset may range from -167 +** First, the TZ string's hour offset may range from -167 ** through 167 as compared to the POSIX-required 0 through 24. ** Second, its DST start time may be January 1 at 00:00 and its stop ** time December 31 at 24:00 plus the difference between DST and @@ -102,21 +95,25 @@ struct tzhead { */ #ifndef TZ_MAX_TIMES -#define TZ_MAX_TIMES 2000 +/* This must be at least 242 for Europe/London with 'zic -b fat'. */ +# define TZ_MAX_TIMES 2000 #endif /* !defined TZ_MAX_TIMES */ #ifndef TZ_MAX_TYPES -/* This must be at least 17 for Europe/Samara and Europe/Vilnius. */ -#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ +/* This must be at least 18 for Europe/Vilnius with 'zic -b fat'. */ +# define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ #endif /* !defined TZ_MAX_TYPES */ #ifndef TZ_MAX_CHARS -#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ +/* This must be at least 40 for America/Anchorage. */ +# define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ /* (limited by what unsigned chars can hold) */ #endif /* !defined TZ_MAX_CHARS */ #ifndef TZ_MAX_LEAPS -#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ +/* This must be at least 27 for leap seconds from 1972 through mid-2023. + There's a plan to discontinue leap seconds by 2035. */ +# define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ #endif /* !defined TZ_MAX_LEAPS */ #endif /* !defined TZFILE_H */ diff --git a/third_party/tz/tzname.c b/third_party/tz/tzname.c new file mode 100644 index 000000000..d21243a61 --- /dev/null +++ b/third_party/tz/tzname.c @@ -0,0 +1,6 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/time.h" + +char *tzname[2]; diff --git a/third_party/tz/windows.py b/third_party/tz/windows.py new file mode 100644 index 000000000..633c78093 --- /dev/null +++ b/third_party/tz/windows.py @@ -0,0 +1,163 @@ +# Thank you Alejandro Zeise for collecting this information +# https://gist.github.com/alejzeis/ad5827eb14b5c22109ba652a1a267af5 + +SUPPORTED = set(( + 'Africa/Algiers', + 'Africa/Cairo', + 'Africa/Johannesburg', + 'Africa/Lagos', + 'Africa/Nairobi', + 'America/Anchorage', + 'America/Argentina/Buenos_Aires', + 'America/Bogota', + 'America/Chicago', + 'America/Denver', + 'America/Lima', + 'America/Los_Angeles', + 'America/Mexico_City', + 'America/New_York', + 'America/Phoenix', + 'America/Santiago', + 'America/Sao_Paulo', + 'Asia/Bangkok', + 'Asia/Dhaka', + 'Asia/Dubai', + 'Asia/Hong_Kong', + 'Asia/Jakarta', + 'Asia/Jerusalem', + 'Asia/Kabul', + 'Asia/Karachi', + 'Asia/Kolkata', + 'Asia/Manila', + 'Asia/Seoul', + 'Asia/Shanghai', + 'Asia/Singapore', + 'Asia/Taipei', + 'Asia/Tehran', + 'Asia/Tokyo', + 'Australia/Adelaide', + 'Australia/Brisbane', + 'Australia/Melbourne', + 'Australia/Perth', + 'Australia/Sydney', + 'CET', + 'CST6CDT', + 'EET', + 'EST', + 'EST5EDT', + 'Etc/GMT', + 'Etc/GMT+1', + 'Etc/GMT+10', + 'Etc/GMT+11', + 'Etc/GMT+12', + 'Etc/GMT+2', + 'Etc/GMT+3', + 'Etc/GMT+4', + 'Etc/GMT+5', + 'Etc/GMT+6', + 'Etc/GMT+7', + 'Etc/GMT+8', + 'Etc/GMT+9', + 'Etc/GMT-1', + 'Etc/GMT-10', + 'Etc/GMT-11', + 'Etc/GMT-12', + 'Etc/GMT-13', + 'Etc/GMT-14', + 'Etc/GMT-2', + 'Etc/GMT-3', + 'Etc/GMT-4', + 'Etc/GMT-5', + 'Etc/GMT-6', + 'Etc/GMT-7', + 'Etc/GMT-8', + 'Etc/GMT-9', + 'Etc/UTC', + 'Europe/Berlin', + 'Europe/Brussels', + 'Europe/Budapest', + 'Europe/Dublin', + 'Europe/Istanbul', + 'Europe/Kyiv', + 'Europe/London', + 'Europe/Madrid', + 'Europe/Moscow', + 'Europe/Paris', + 'Europe/Prague', + 'Europe/Rome', + 'Europe/Vienna', + 'Europe/Warsaw', + 'Europe/Zurich', + 'GMT', + 'HST', + 'MET', + 'MST', + 'MST7MDT', + 'PST8PDT', + 'Pacific/Auckland', + 'Pacific/Fiji', + 'Pacific/Guam', + 'Pacific/Honolulu', + 'Pacific/Port_Moresby', + 'WET', +)) + +import re +import os +import subprocess + +NAMES = set() +ZONES = set() +SUPERFLUOUS = set() +TABLE1 = [] +TABLE2 = [] + +with open("/home/jart/scratch/windows-timezone-mappings.csv") as f: + for line in f: + line = line.strip() + if not line: + break + name, what, zone = line.split(',') + if name in NAMES: + continue + ZZ = zone.split() # has superfluous zones + ZZ = [z for z in ZZ if z in SUPPORTED] + [z for z in ZZ if z not in SUPPORTED] + zone = ZZ[0] + rest = ZZ[1:] + NAMES.add(name) + ZONES.add(ZZ[0]) + SUPERFLUOUS |= set(rest) + os.environ['TZ'] = zone + p = subprocess.Popen(['date', '+%z@%Z'], stdout=subprocess.PIPE) + z, Z = p.stdout.read().decode('utf-8').strip().split('@') + print("%-35s %-5s %-10s %-10s %-30s" % (name, what, z, Z, zone)) + if zone in SUPPORTED: + TABLE1.append((name, zone, z, Z)) + else: + TABLE2.append((name, zone, z, Z)) + +print() +TABLE1.sort() +TABLE2.sort() +for k, v, z, Z in TABLE1: + print('{"%s", "%s"}, // %s %s' % (k, v, z, Z)) +print('#ifdef EMBED_EVERY_TIME_ZONE') +for k, v, z, Z in TABLE2: + print('{"%s", "%s"}, // %s %s' % (k, v, z, Z)) +print('#endif') + +# print() +# TABLE.sort(key=lambda x: (int(x[2]), x[1])) +# for k, v, z, Z in TABLE: +# if re.search(r'[A-Z]', Z): +# Z = ' ' + Z +# else: +# Z = '' +# print('__static_yoink("usr/share/zoneinfo/%s"); // %s%s (%s)' % (v, z, Z, k)) +# print('#ifdef EMBED_EVERY_TIME_ZONE') +# print('#endif') + +# print() +# SUPERFLUOUS -= ZONES +# for z in SUPERFLUOUS: +# print(z) diff --git a/third_party/unzip/BUILD.mk b/third_party/unzip/BUILD.mk index 945aef41c..b1db75282 100644 --- a/third_party/unzip/BUILD.mk +++ b/third_party/unzip/BUILD.mk @@ -23,8 +23,8 @@ THIRD_PARTY_UNZIP_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ - THIRD_PARTY_BZIP2 + THIRD_PARTY_BZIP2 \ + THIRD_PARTY_TZ THIRD_PARTY_UNZIP_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_UNZIP_A_DIRECTDEPS),$($(x)))) diff --git a/third_party/unzip/timezone.c b/third_party/unzip/timezone.c index 95cf80652..8edd5bcf5 100644 --- a/third_party/unzip/timezone.c +++ b/third_party/unzip/timezone.c @@ -36,7 +36,7 @@ #include "third_party/unzip/zip.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "third_party/unzip/timezone.h" #ifdef IZTZ_DEFINESTDGLOBALS diff --git a/third_party/unzip/unix.c b/third_party/unzip/unix.c index 6e15a11e0..a5a35f32e 100644 --- a/third_party/unzip/unix.c +++ b/third_party/unzip/unix.c @@ -30,9 +30,9 @@ #define UNZIP_INTERNAL #include "libc/calls/struct/dirent.h" #include "libc/log/log.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/unzip/unzip.h" -#include "libc/time/struct/utimbuf.h" +#include "libc/utime.h" #include "third_party/unzip/globals.h" #ifdef USE_ICONV_MAPPING diff --git a/third_party/unzip/unxcfg.h b/third_party/unzip/unxcfg.h index a3ba26301..c4d13dbb8 100644 --- a/third_party/unzip/unxcfg.h +++ b/third_party/unzip/unxcfg.h @@ -15,7 +15,7 @@ #include "libc/calls/struct/stat.h" #include "libc/sysv/consts/o.h" #include "libc/str/str.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/calls/weirdtypes.h" diff --git a/third_party/xxhash/BUILD.mk b/third_party/xxhash/BUILD.mk index 2cfc33615..01c13ca84 100644 --- a/third_party/xxhash/BUILD.mk +++ b/third_party/xxhash/BUILD.mk @@ -21,7 +21,7 @@ THIRD_PARTY_XXHASH_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME + THIRD_PARTY_TZ THIRD_PARTY_XXHASH_A_DEPS := \ $(call uniq,$(foreach x,$(THIRD_PARTY_XXHASH_A_DIRECTDEPS),$($(x)))) diff --git a/third_party/xxhash/cli/xsum_bench.c b/third_party/xxhash/cli/xsum_bench.c index 12f0e2c0b..8e56eea25 100644 --- a/third_party/xxhash/cli/xsum_bench.c +++ b/third_party/xxhash/cli/xsum_bench.c @@ -61,8 +61,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock_t, clock, CLOCKS_PER_SEC */ +#include "libc/time.h" /* clock_t, clock, CLOCKS_PER_SEC */ #include "libc/errno.h" /* errno */ #define TIMELOOP_S 1 diff --git a/third_party/xxhash/cli/xsum_config.h b/third_party/xxhash/cli/xsum_config.h index a30cf28a4..f926284c5 100644 --- a/third_party/xxhash/cli/xsum_config.h +++ b/third_party/xxhash/cli/xsum_config.h @@ -87,7 +87,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* declares _POSIX_VERSION */ # if defined(_POSIX_VERSION) /* POSIX compliant */ @@ -138,7 +138,7 @@ #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/str/unicode.h" -#include "libc/time/time.h" +#include "libc/time.h" # if WCHAR_MAX == 0xFFFFU /* UTF-16 wchar_t */ # define XSUM_WIN32_USE_WCHAR 1 # else diff --git a/third_party/xxhash/cli/xsum_os_specific.c b/third_party/xxhash/cli/xsum_os_specific.c index 1a767a16b..3b5fb88fe 100644 --- a/third_party/xxhash/cli/xsum_os_specific.c +++ b/third_party/xxhash/cli/xsum_os_specific.c @@ -31,7 +31,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" /* stat() / _stat64() */ +#include "libc/time.h" /* stat() / _stat64() */ /* * This file contains all of the ugly boilerplate to make xxhsum work across @@ -60,7 +60,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* isatty */ # define XSUM_IS_CONSOLE(stdStream) isatty(fileno(stdStream)) @@ -207,7 +207,7 @@ int main(int argc, const char* argv[]) #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/str/unicode.h" -#include "libc/time/time.h" +#include "libc/time.h" /***************************************************************************** * Unicode conversion tools diff --git a/third_party/xxhash/tests/bench/timefn.h b/third_party/xxhash/tests/bench/timefn.h index ce52d1265..2ab164ab9 100644 --- a/third_party/xxhash/tests/bench/timefn.h +++ b/third_party/xxhash/tests/bench/timefn.h @@ -30,8 +30,7 @@ extern "C" { #if defined(_MSC_VER) // MISSING #include /* utime */ #else -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" /* utime */ +#include "libc/time.h" /* utime */ #endif #include "libc/calls/calls.h" #include "libc/calls/struct/timespec.h" @@ -40,8 +39,7 @@ extern "C" { #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock_t, clock, CLOCKS_PER_SEC */ +#include "libc/time.h" /* clock_t, clock, CLOCKS_PER_SEC */ diff --git a/third_party/xxhash/tests/collisions/main.c b/third_party/xxhash/tests/collisions/main.c index 8970021c2..bb6499d1d 100644 --- a/third_party/xxhash/tests/collisions/main.c +++ b/third_party/xxhash/tests/collisions/main.c @@ -506,8 +506,7 @@ static inline int Filter_check(const Filter* bf, int bflog, uint64_t hash) #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock_t, clock, time_t, time, difftime */ +#include "libc/time.h" /* clock_t, clock, time_t, time, difftime */ void update_indicator(uint64_t v, uint64_t total) { diff --git a/third_party/zip/BUILD.mk b/third_party/zip/BUILD.mk index 3ca3d80c9..d0a163fc3 100644 --- a/third_party/zip/BUILD.mk +++ b/third_party/zip/BUILD.mk @@ -90,9 +90,9 @@ THIRD_PARTY_ZIP_DIRECTDEPS = \ LIBC_PROC \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ LIBC_X \ THIRD_PARTY_BZIP2 \ + THIRD_PARTY_TZ \ THIRD_PARTY_ZLIB THIRD_PARTY_ZIP_DEPS := \ diff --git a/third_party/zip/crypt.c b/third_party/zip/crypt.c index bfb702905..e1d9e89d5 100644 --- a/third_party/zip/crypt.c +++ b/third_party/zip/crypt.c @@ -80,8 +80,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* time() function supplies first part of crypt seed */ +#include "libc/time.h" /* time() function supplies first part of crypt seed */ /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 # define ZCR_SEED2 (unsigned)3141592654L /* use PI as default pattern */ diff --git a/third_party/zip/fileio.c b/third_party/zip/fileio.c index 0e4ee237e..cb988b030 100644 --- a/third_party/zip/fileio.c +++ b/third_party/zip/fileio.c @@ -30,8 +30,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #ifdef NO_MKTIME time_t mktime OF((struct tm *)); diff --git a/third_party/zip/osdep.h b/third_party/zip/osdep.h index c002669db..a7299afac 100644 --- a/third_party/zip/osdep.h +++ b/third_party/zip/osdep.h @@ -41,7 +41,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" +#include "libc/time.h" /* printf format size prefix for zoff_t values */ #ifdef LARGE_FILE_SUPPORT diff --git a/third_party/zip/tailor.h b/third_party/zip/tailor.h index 34dc03491..248fbb12b 100644 --- a/third_party/zip/tailor.h +++ b/third_party/zip/tailor.h @@ -258,7 +258,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* usually defines _POSIX_VERSION */ #endif /* !NO_UNISTD_H */ @@ -382,7 +382,7 @@ IZ_IMP char *mktemp(); #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/str/unicode.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/calls/calls.h" #include "libc/fmt/conv.h" #include "libc/str/str.h" diff --git a/third_party/zip/unix.c b/third_party/zip/unix.c index ef9593e99..a1b08b5dc 100644 --- a/third_party/zip/unix.c +++ b/third_party/zip/unix.c @@ -19,8 +19,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #if defined(MINIX) || defined(__mpexl) # ifdef S_IWRITE @@ -60,8 +59,7 @@ /* Library functions not in (most) header files */ #ifdef _POSIX_VERSION -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" +#include "libc/utime.h" #else int utime OF((char *, time_t *)); #endif diff --git a/third_party/zip/zip.c b/third_party/zip/zip.c index baf29593e..8b064dd9e 100644 --- a/third_party/zip/zip.c +++ b/third_party/zip/zip.c @@ -20,8 +20,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* for tzset() declaration */ +#include "libc/time.h" /* for tzset() declaration */ #if defined(WIN32) || defined(WINDLL) # define WIN32_LEAN_AND_MEAN #include "libc/nt/accounting.h" diff --git a/third_party/zstd/BUILD.mk b/third_party/zstd/BUILD.mk index 2bf4f894d..1216ed9a4 100644 --- a/third_party/zstd/BUILD.mk +++ b/third_party/zstd/BUILD.mk @@ -124,7 +124,6 @@ THIRD_PARTY_ZSTD_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_THREAD \ - LIBC_TIME \ LIBC_SYSV THIRD_PARTY_ZSTD_A_DEPS := \ diff --git a/third_party/zstd/lib/compress/zstdmt_compress.c b/third_party/zstd/lib/compress/zstdmt_compress.c index 6d15654f4..35fd48ad3 100644 --- a/third_party/zstd/lib/compress/zstdmt_compress.c +++ b/third_party/zstd/lib/compress/zstdmt_compress.c @@ -55,7 +55,7 @@ #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" #include "libc/calls/calls.h" diff --git a/third_party/zstd/lib/dictBuilder/cover.c b/third_party/zstd/lib/dictBuilder/cover.c index da4f1e2ba..46a4201e8 100644 --- a/third_party/zstd/lib/dictBuilder/cover.c +++ b/third_party/zstd/lib/dictBuilder/cover.c @@ -52,8 +52,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock */ +#include "libc/time.h" /* clock */ #ifndef ZDICT_STATIC_LINKING_ONLY # define ZDICT_STATIC_LINKING_ONLY diff --git a/third_party/zstd/lib/dictBuilder/cover.h b/third_party/zstd/lib/dictBuilder/cover.h index a5148b0eb..ec5e7d1e8 100644 --- a/third_party/zstd/lib/dictBuilder/cover.h +++ b/third_party/zstd/lib/dictBuilder/cover.h @@ -43,8 +43,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock */ +#include "libc/time.h" /* clock */ #include "third_party/zstd/lib/common/mem.h" /* read */ #include "third_party/zstd/lib/common/pool.h" #include "third_party/zstd/lib/common/threading.h" diff --git a/third_party/zstd/lib/dictBuilder/fastcover.c b/third_party/zstd/lib/dictBuilder/fastcover.c index 877ce5392..39bd0949d 100644 --- a/third_party/zstd/lib/dictBuilder/fastcover.c +++ b/third_party/zstd/lib/dictBuilder/fastcover.c @@ -42,8 +42,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock */ +#include "libc/time.h" /* clock */ #ifndef ZDICT_STATIC_LINKING_ONLY # define ZDICT_STATIC_LINKING_ONLY diff --git a/third_party/zstd/lib/dictBuilder/zdict.c b/third_party/zstd/lib/dictBuilder/zdict.c index eafcb3578..479937ae5 100644 --- a/third_party/zstd/lib/dictBuilder/zdict.c +++ b/third_party/zstd/lib/dictBuilder/zdict.c @@ -67,8 +67,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock */ +#include "libc/time.h" /* clock */ #ifndef ZDICT_STATIC_LINKING_ONLY # define ZDICT_STATIC_LINKING_ONLY diff --git a/third_party/zstd/programs/fileio.c b/third_party/zstd/programs/fileio.c index 22c264b8f..248893ae9 100644 --- a/third_party/zstd/programs/fileio.c +++ b/third_party/zstd/programs/fileio.c @@ -56,8 +56,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock_t, to measure process time */ +#include "libc/time.h" /* clock_t, to measure process time */ #include "libc/calls/calls.h" #include "libc/calls/struct/flock.h" #include "libc/calls/weirdtypes.h" @@ -94,7 +93,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" +#include "libc/time.h" // MISSING #include #endif diff --git a/third_party/zstd/programs/fileio_asyncio.c b/third_party/zstd/programs/fileio_asyncio.c index 7630b2f17..646477be3 100644 --- a/third_party/zstd/programs/fileio_asyncio.c +++ b/third_party/zstd/programs/fileio_asyncio.c @@ -41,7 +41,7 @@ #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" +#include "libc/time.h" // MISSING #include #endif diff --git a/third_party/zstd/programs/platform.h b/third_party/zstd/programs/platform.h index 3e3c9f07a..ea93039d7 100644 --- a/third_party/zstd/programs/platform.h +++ b/third_party/zstd/programs/platform.h @@ -92,7 +92,7 @@ extern "C" { #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" whenever target OS is not unix-like * otherwise it will block preprocessing stage. @@ -105,7 +105,7 @@ extern "C" { #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" @@ -128,7 +128,7 @@ extern "C" { #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* declares _POSIX_VERSION */ @@ -179,7 +179,7 @@ extern "C" { #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* isatty */ diff --git a/third_party/zstd/programs/timefn.c b/third_party/zstd/programs/timefn.c index 7b4b47871..ee8a5bed7 100644 --- a/third_party/zstd/programs/timefn.c +++ b/third_party/zstd/programs/timefn.c @@ -20,8 +20,7 @@ #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* CLOCK_MONOTONIC, TIME_UTC */ +#include "libc/time.h" /* CLOCK_MONOTONIC, TIME_UTC */ /*-**************************************** * Time functions diff --git a/third_party/zstd/programs/util.c b/third_party/zstd/programs/util.c index 2bf785640..1e53f23c2 100644 --- a/third_party/zstd/programs/util.c +++ b/third_party/zstd/programs/util.c @@ -45,8 +45,7 @@ extern "C" { #include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/sched.h" #include "libc/sysv/consts/timer.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" /* clock_t, clock, CLOCKS_PER_SEC, nanosleep */ +#include "libc/time.h" /* clock_t, clock, CLOCKS_PER_SEC, nanosleep */ #include "libc/errno.h" #include "libc/assert.h" @@ -63,13 +62,13 @@ extern "C" { #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* chown, stat */ # if PLATFORM_POSIX_VERSION < 200809L || !defined(st_mtime) -#include "libc/time/struct/utimbuf.h" -#include "libc/time/time.h" /* utime */ +#include "libc/utime.h" +#include "libc/time.h" /* utime */ # else #include "libc/calls/calls.h" #include "libc/calls/struct/flock.h" @@ -88,7 +87,7 @@ extern "C" { #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" /* utimensat */ +#include "libc/time.h" /* utimensat */ # endif #endif diff --git a/third_party/zstd/programs/util.h b/third_party/zstd/programs/util.h index d7a7a0ee8..bd39d78f6 100644 --- a/third_party/zstd/programs/util.h +++ b/third_party/zstd/programs/util.h @@ -36,7 +36,7 @@ extern "C" { #include "libc/calls/weirdtypes.h" #include "libc/sysv/consts/s.h" #include "libc/sysv/consts/utime.h" -#include "libc/time/time.h" /* stat, chmod */ +#include "libc/time.h" /* stat, chmod */ #include "third_party/zstd/lib/common/mem.h" /* U64 */ @@ -91,7 +91,7 @@ extern "C" { #include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/ok.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/musl/crypt.h" #include "third_party/musl/lockf.h" /* sleep */ # define UTIL_sleep(s) sleep(s) diff --git a/tool/build/BUILD.mk b/tool/build/BUILD.mk index 1810aed74..844a0ab28 100644 --- a/tool/build/BUILD.mk +++ b/tool/build/BUILD.mk @@ -45,7 +45,6 @@ TOOL_BUILD_DIRECTDEPS = \ LIBC_SYSV \ LIBC_SYSV_CALLS \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ NET_HTTP \ @@ -57,6 +56,7 @@ TOOL_BUILD_DIRECTDEPS = \ THIRD_PARTY_MUSL \ THIRD_PARTY_REGEX \ THIRD_PARTY_STB \ + THIRD_PARTY_TZ \ THIRD_PARTY_XED \ THIRD_PARTY_ZLIB \ THIRD_PARTY_ZLIB_GZ \ diff --git a/tool/build/compile.c b/tool/build/compile.c index 6707351d3..3fbecc55c 100644 --- a/tool/build/compile.c +++ b/tool/build/compile.c @@ -61,7 +61,7 @@ #include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/termios.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "third_party/getopt/getopt.internal.h" diff --git a/tool/build/lib/BUILD.mk b/tool/build/lib/BUILD.mk index 0d40181f2..9fe70e019 100644 --- a/tool/build/lib/BUILD.mk +++ b/tool/build/lib/BUILD.mk @@ -46,7 +46,6 @@ TOOL_BUILD_LIB_A_DIRECTDEPS = \ LIBC_SYSV_CALLS \ LIBC_PROC \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ NET_HTTP \ @@ -54,7 +53,8 @@ TOOL_BUILD_LIB_A_DIRECTDEPS = \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_MBEDTLS \ THIRD_PARTY_XED \ - THIRD_PARTY_ZLIB + THIRD_PARTY_ZLIB \ + THIRD_PARTY_TZ TOOL_BUILD_LIB_A_DEPS := \ $(call uniq,$(foreach x,$(TOOL_BUILD_LIB_A_DIRECTDEPS),$($(x)))) diff --git a/tool/build/lib/elfwriter_zip.c b/tool/build/lib/elfwriter_zip.c index 7264c8f83..dbe1562d1 100644 --- a/tool/build/lib/elfwriter_zip.c +++ b/tool/build/lib/elfwriter_zip.c @@ -22,7 +22,6 @@ #include "libc/limits.h" #include "libc/log/check.h" #include "libc/mem/gc.h" -#include "libc/mem/gc.h" #include "libc/mem/mem.h" #include "libc/nexgen32e/crc32.h" #include "libc/nt/enum/fileflagandattributes.h" @@ -31,7 +30,7 @@ #include "libc/stdio/rand.h" #include "libc/str/str.h" #include "libc/sysv/consts/s.h" -#include "libc/time/struct/tm.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/x/xasprintf.h" #include "libc/zip.internal.h" diff --git a/tool/build/runitd.c b/tool/build/runitd.c index 7c8023499..14b1a7e7e 100644 --- a/tool/build/runitd.c +++ b/tool/build/runitd.c @@ -71,8 +71,7 @@ #include "libc/temp.h" #include "libc/thread/thread.h" #include "libc/thread/thread2.h" -#include "libc/time/struct/tm.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/x/xsigaction.h" #include "net/http/escape.h" diff --git a/tool/build/zipobj.c b/tool/build/zipobj.c index f07193539..37cb3ef89 100644 --- a/tool/build/zipobj.c +++ b/tool/build/zipobj.c @@ -37,7 +37,7 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/s.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "libc/zip.internal.h" #include "third_party/getopt/getopt.internal.h" diff --git a/tool/curl/BUILD.mk b/tool/curl/BUILD.mk index d020ec1df..93b739325 100644 --- a/tool/curl/BUILD.mk +++ b/tool/curl/BUILD.mk @@ -24,12 +24,12 @@ TOOL_CURL_DIRECTDEPS = \ LIBC_STDIO \ LIBC_STR \ LIBC_SYSV \ - LIBC_TIME \ NET_HTTP \ NET_HTTPS \ THIRD_PARTY_GETOPT \ THIRD_PARTY_MBEDTLS \ - THIRD_PARTY_MUSL + THIRD_PARTY_MUSL \ + THIRD_PARTY_TZ TOOL_CURL_DEPS := \ $(call uniq,$(foreach x,$(TOOL_CURL_DIRECTDEPS),$($(x)))) diff --git a/tool/decode/BUILD.mk b/tool/decode/BUILD.mk index e5d2e9eb2..00318107c 100644 --- a/tool/decode/BUILD.mk +++ b/tool/decode/BUILD.mk @@ -33,11 +33,11 @@ TOOL_DECODE_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_SYSV_CALLS \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ THIRD_PARTY_GDTOA \ THIRD_PARTY_GETOPT \ + THIRD_PARTY_TZ \ THIRD_PARTY_XED \ TOOL_DECODE_LIB diff --git a/tool/decode/zip.c b/tool/decode/zip.c index f83f99ff3..e0f8101f4 100644 --- a/tool/decode/zip.c +++ b/tool/decode/zip.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" #include "libc/calls/calls.h" #include "libc/calls/struct/stat.h" #include "libc/fmt/libgen.h" @@ -36,8 +37,8 @@ #include "libc/sysv/consts/map.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" +#include "libc/time.h" #include "libc/x/xasprintf.h" -#include "libc/x/xiso8601.h" #include "libc/zip.internal.h" #include "tool/decode/lib/asmcodegen.h" #include "tool/decode/lib/disassemblehex.h" @@ -63,6 +64,24 @@ static __wur char *FormatDosTime(uint16_t dostime) { (dostime >> 5) & 0b111111, (dostime << 1) & 0b111110); } +char *xiso8601(struct timespec ts) { + struct tm tm; + if (!localtime_r(&ts.tv_sec, &tm)) + return 0; + int len = 128; + char *res = malloc(len); + char *ptr = res; + char *end = res + len; + if (!res) + return 0; + ptr += strftime(ptr, end - ptr, "%Y-%m-%dT%H:%M:%S", &tm); + ptr += snprintf(ptr, end - ptr, "%09ld", ts.tv_nsec); + ptr += strftime(ptr, end - ptr, "%z", &tm); + unassert(ptr + 1 <= end); + unassert(realloc_in_place(res, ptr - end) == res); + return res; +} + void AdvancePosition(uint8_t *map, size_t *pos, size_t off) { if (off > *pos) { /* printf("\n/\t<%s>\n", "LIMBO"); */ @@ -108,13 +127,13 @@ void ShowNtfs(uint8_t *ntfs, size_t n) { "ntfs attribute tag value #1"); show(".short", gc(xasprintf("%hu", READ16LE(ntfs + 6))), "ntfs attribute tag size"); - show(".quad", gc(xasprintf("%lu", READ64LE(ntfs + 8))), - gc(xasprintf("%s (%s)", "ntfs last modified time", - gc(xiso8601(&mtime))))); + show( + ".quad", gc(xasprintf("%lu", READ64LE(ntfs + 8))), + gc(xasprintf("%s (%s)", "ntfs last modified time", gc(xiso8601(mtime))))); show(".quad", gc(xasprintf("%lu", READ64LE(ntfs + 16))), - gc(xasprintf("%s (%s)", "ntfs last access time", gc(xiso8601(&atime))))); + gc(xasprintf("%s (%s)", "ntfs last access time", gc(xiso8601(atime))))); show(".quad", gc(xasprintf("%lu", READ64LE(ntfs + 24))), - gc(xasprintf("%s (%s)", "ntfs creation time", gc(xiso8601(&ctime))))); + gc(xasprintf("%s (%s)", "ntfs creation time", gc(xiso8601(ctime))))); } void ShowExtendedTimestamp(uint8_t *p, size_t n, bool islocal) { @@ -126,7 +145,7 @@ void ShowExtendedTimestamp(uint8_t *p, size_t n, bool islocal) { if ((flag & 1) && n >= 4) { show(".long", gc(xasprintf("%u", READ32LE(p))), gc(xasprintf("%s (%s)", "last modified", - gc(xiso8601(&(struct timespec){READ32LE(p)}))))); + gc(xiso8601((struct timespec){READ32LE(p)}))))); p += 4; n -= 4; } @@ -135,7 +154,7 @@ void ShowExtendedTimestamp(uint8_t *p, size_t n, bool islocal) { if ((flag & 1) && n >= 4) { show(".long", gc(xasprintf("%u", READ32LE(p))), gc(xasprintf("%s (%s)", "access time", - gc(xiso8601(&(struct timespec){READ32LE(p)}))))); + gc(xiso8601((struct timespec){READ32LE(p)}))))); p += 4; n -= 4; } @@ -143,7 +162,7 @@ void ShowExtendedTimestamp(uint8_t *p, size_t n, bool islocal) { if ((flag & 1) && n >= 4) { show(".long", gc(xasprintf("%u", READ32LE(p))), gc(xasprintf("%s (%s)", "creation time", - gc(xiso8601(&(struct timespec){READ32LE(p)}))))); + gc(xiso8601((struct timespec){READ32LE(p)}))))); p += 4; n -= 4; } diff --git a/tool/emacs/cosmo-stuff.el b/tool/emacs/cosmo-stuff.el index bfca961fe..d8dc17376 100644 --- a/tool/emacs/cosmo-stuff.el +++ b/tool/emacs/cosmo-stuff.el @@ -719,7 +719,7 @@ (default-directory root) (compile-command (cosmo--compile-command this root nil mode "" "" ".runs"))) (compile compile-command) - (gdb (format "gdb -q -nh -i=mi %s -ex run" exec)))))) + (gdb (format "gdb -q -i=mi %s -ex run" exec)))))) (progn (define-key asm-mode-map (kbd "C-c C-d") 'cosmo-debug) diff --git a/tool/net/BUILD.mk b/tool/net/BUILD.mk index 1c7219492..52d55f7ec 100644 --- a/tool/net/BUILD.mk +++ b/tool/net/BUILD.mk @@ -47,7 +47,6 @@ TOOL_NET_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_SYSV_CALLS \ - LIBC_TIME \ LIBC_THREAD \ LIBC_TINYMATH \ LIBC_X \ @@ -66,6 +65,7 @@ TOOL_NET_DIRECTDEPS = \ THIRD_PARTY_MBEDTLS \ THIRD_PARTY_REGEX \ THIRD_PARTY_SQLITE3 \ + THIRD_PARTY_TZ \ THIRD_PARTY_ZLIB \ TOOL_ARGS \ TOOL_BUILD_LIB \ diff --git a/tool/net/lfuncs.c b/tool/net/lfuncs.c index 7629d9e9b..e8d566d94 100644 --- a/tool/net/lfuncs.c +++ b/tool/net/lfuncs.c @@ -52,7 +52,7 @@ #include "libc/sysv/consts/rusage.h" #include "libc/sysv/consts/sock.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "net/http/escape.h" #include "net/http/http.h" diff --git a/tool/plinko/lib/plinko.c b/tool/plinko/lib/plinko.c index 9766469b8..80417f1f6 100644 --- a/tool/plinko/lib/plinko.c +++ b/tool/plinko/lib/plinko.c @@ -38,7 +38,6 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/sig.h" -#include "libc/time/clockstonanos.internal.h" #include "third_party/getopt/getopt.internal.h" #include "tool/build/lib/case.h" #include "tool/plinko/lib/char.h" @@ -59,6 +58,13 @@ STATIC_STACK_SIZE(0x100000); #define DISPATCH(ea, tm, r, p1, p2) \ GetDispatchFn(LO(ea))(ea, tm, r, p1, p2, GetShadow(LO(ea))) +static inline uint64_t ClocksToNanos(uint64_t x, uint64_t y) { + // approximation of round(x*.323018) which is usually + // the ratio between inva rdtsc ticks and nanoseconds + uint128_t difference = x - y; + return (difference * 338709) >> 20; +} + static void Unwind(int S) { int s; dword t; diff --git a/tool/plinko/lib/printf.c b/tool/plinko/lib/printf.c index ddc4c50be..09b7da750 100644 --- a/tool/plinko/lib/printf.c +++ b/tool/plinko/lib/printf.c @@ -21,11 +21,17 @@ #include "libc/nexgen32e/rdtsc.h" #include "libc/runtime/runtime.h" #include "libc/str/str.h" -#include "libc/time/clockstonanos.internal.h" #include "tool/plinko/lib/char.h" #include "tool/plinko/lib/plinko.h" #include "tool/plinko/lib/print.h" +static inline uint64_t ClocksToNanos(uint64_t x, uint64_t y) { + // approximation of round(x*.323018) which is usually + // the ratio between inva rdtsc ticks and nanoseconds + uint128_t difference = x - y; + return (difference * 338709) >> 20; +} + static inline long GetVarInt(va_list va, signed char t) { if (t <= 0) return va_arg(va, int); diff --git a/tool/viz/BUILD.mk b/tool/viz/BUILD.mk index 73473d3f3..a087fbf8e 100644 --- a/tool/viz/BUILD.mk +++ b/tool/viz/BUILD.mk @@ -38,7 +38,6 @@ TOOL_VIZ_DIRECTDEPS = \ LIBC_SYSV \ LIBC_SYSV_CALLS \ LIBC_THREAD \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_VGA \ LIBC_X \ @@ -50,6 +49,7 @@ TOOL_VIZ_DIRECTDEPS = \ THIRD_PARTY_MAXMIND \ THIRD_PARTY_MUSL \ THIRD_PARTY_STB \ + THIRD_PARTY_TZ \ THIRD_PARTY_XED \ THIRD_PARTY_ZLIB \ TOOL_DECODE_LIB \ diff --git a/tool/viz/cpuid.c b/tool/viz/cpuid.c index 657296118..0384d4f30 100644 --- a/tool/viz/cpuid.c +++ b/tool/viz/cpuid.c @@ -26,7 +26,7 @@ #include "libc/nexgen32e/x86info.h" #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/xasprintf.h" #include "tool/decode/lib/idname.h" #include "tool/decode/lib/x86idnames.h" diff --git a/tool/viz/lib/BUILD.mk b/tool/viz/lib/BUILD.mk index a26d88ed3..92512372c 100644 --- a/tool/viz/lib/BUILD.mk +++ b/tool/viz/lib/BUILD.mk @@ -38,12 +38,12 @@ TOOL_VIZ_LIB_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ LIBC_TESTLIB \ - LIBC_TIME \ LIBC_TINYMATH \ LIBC_X \ THIRD_PARTY_COMPILER_RT \ THIRD_PARTY_DLMALLOC \ - THIRD_PARTY_GDTOA + THIRD_PARTY_GDTOA \ + THIRD_PARTY_TZ TOOL_VIZ_LIB_A_DEPS := \ $(call uniq,$(foreach x,$(TOOL_VIZ_LIB_A_DIRECTDEPS),$($(x)))) diff --git a/tool/viz/lib/sharpen.c b/tool/viz/lib/sharpen.c index 55bd5cdd0..eec139e4d 100644 --- a/tool/viz/lib/sharpen.c +++ b/tool/viz/lib/sharpen.c @@ -21,7 +21,7 @@ #include "libc/mem/mem.h" #include "libc/str/str.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "tool/viz/lib/convolution.h" #include "tool/viz/lib/graphic.h" diff --git a/tool/viz/lib/unsharp.c b/tool/viz/lib/unsharp.c index 1c1eb9cb4..e4a29ca01 100644 --- a/tool/viz/lib/unsharp.c +++ b/tool/viz/lib/unsharp.c @@ -20,7 +20,7 @@ #include "libc/mem/mem.h" #include "libc/str/str.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "tool/viz/lib/convolution.h" #include "tool/viz/lib/graphic.h" diff --git a/tool/viz/lib/ycbcr2rgb3.c b/tool/viz/lib/ycbcr2rgb3.c index 4e8e84b63..96d7d52ff 100644 --- a/tool/viz/lib/ycbcr2rgb3.c +++ b/tool/viz/lib/ycbcr2rgb3.c @@ -44,7 +44,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/sig.h" #include "libc/sysv/errfuns.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/x.h" #include "tool/viz/lib/graphic.h" #include "tool/viz/lib/knobs.h" diff --git a/tool/viz/life.c b/tool/viz/life.c index a57ebbe6c..896e19034 100644 --- a/tool/viz/life.c +++ b/tool/viz/life.c @@ -67,7 +67,7 @@ #include "libc/sysv/consts/poll.h" #include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/termios.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" /** diff --git a/tool/viz/memzoom.c b/tool/viz/memzoom.c index 8c4eebf7c..fc19e835e 100644 --- a/tool/viz/memzoom.c +++ b/tool/viz/memzoom.c @@ -52,7 +52,7 @@ #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/termios.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "third_party/getopt/getopt.internal.h" #define USAGE \ diff --git a/tool/viz/printpeb.c b/tool/viz/printpeb.c index a92ab375d..e311b4932 100644 --- a/tool/viz/printpeb.c +++ b/tool/viz/printpeb.c @@ -38,7 +38,7 @@ #include "libc/stdio/stdio.h" #include "libc/sysv/consts/madv.h" #include "libc/sysv/consts/o.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "tool/decode/lib/flagger.h" #include "tool/decode/lib/idname.h" #if defined(__x86_64__) && SupportsWindows() diff --git a/tool/viz/printvideo.c b/tool/viz/printvideo.c index 7d5c04127..6216174c8 100644 --- a/tool/viz/printvideo.c +++ b/tool/viz/printvideo.c @@ -89,7 +89,7 @@ #include "libc/sysv/consts/w.h" #include "libc/sysv/errfuns.h" #include "libc/thread/thread.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/xsigaction.h" #include "third_party/getopt/getopt.internal.h" #include "third_party/stb/stb_image_resize.h" diff --git a/tool/viz/tailf.c b/tool/viz/tailf.c index 054feed29..f50a0f153 100644 --- a/tool/viz/tailf.c +++ b/tool/viz/tailf.c @@ -25,7 +25,7 @@ #include "libc/str/str.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/sig.h" -#include "libc/time/time.h" +#include "libc/time.h" #include "libc/x/xsigaction.h" /** diff --git a/usr/share/zoneinfo/Africa/Abidjan b/usr/share/zoneinfo/Africa/Abidjan new file mode 100644 index 0000000000000000000000000000000000000000..8906e88c819d9ad3b794eb6356a240a74a95ffae GIT binary patch literal 130 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;j{iU~>DeR?#{d8SSb#JG0gI1s2!lHia{&nh FE&z`x5Apy2 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Algiers b/usr/share/zoneinfo/Africa/Algiers new file mode 100644 index 0000000000000000000000000000000000000000..56a4dd2a19fac5cc1bb1951dedf3ae93e0b9e321 GIT binary patch literal 470 zcmWHE%1kq2AP5+NDnJ+nLI`V70xDwzVyXW?kbQEt3W%PV5a17@XS-K?0MplX3PALn zJrlw7+yfq9@p+y9!2J0Ow7~oY2}{BB!Ui5Ny+}_8OfRnT0nXvkI2VBE^OH;jK=g$!1_ls)u}BQezvQO^)_2959ZWwxcNr}IIcCELkbjvf z4uWZB=M!L>_xyE`FazIO7cif{A_~kG$cPjGF@(yT3qZ7Rno|Ra7KyI`i;MclGcYnU zp+Hs^AY^6*iGdhQ%&b8B?tpYL88WZ{?GRw(0Pz@j85m>~7zIHh3}QaMAq)XP9PSzn TB0?CPK@4Xgg9}LL8gc;uxvi~T literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Bissau b/usr/share/zoneinfo/Africa/Bissau new file mode 100644 index 0000000000000000000000000000000000000000..0da1d1e211bc6b9b081959c1d510583cb9eb7102 GIT binary patch literal 149 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$VxIp%FzMNx2_Su(>4^f2O#lCXOkrREk{=jY YK%xvBKE5Fgx(0>}?m(IgNEmPd02-+k!vFvP literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Cairo b/usr/share/zoneinfo/Africa/Cairo new file mode 100644 index 0000000000000000000000000000000000000000..1e6d48d1ca4e5416913c41e8814dc045c57d5b58 GIT binary patch literal 1309 zcmc)I>r0bS00!_gZ|T%(YMJJ2mCH46+nSoWw9<*%M#eTu88u6kiej;Z)WRWASVq`B z7zHWasI-e&mZ3rh<)v~NCMeVvk;_b%PQ~T2_dNXpe(a3x+3!5h3qw@r9VnEL1rLi^ z&^JBmg&Gk50gKhK<#ZOVF@ou40|>*2QzR`l;) zIpE$4g|PWf3H<()4(>a9FNZ#7OW2R+ZH^dt#J2?=>DOWZW7KJAw3C)hLU z8tj$E!G4inzmZ;eN6688kNKcydmcy6?vV zE_h3Isf93StJYwqx$UUdLNiUKfzx-U!14eW_8DRxoMAZ#XL8)&%%>dev+Q5t?DH+? zw-2&(ggJ`*HuQ?h-RKoJoaj}>8(~#LC3@9htB#oybwmaFf^56ajrD(D%zu-H{wAS_ sIwNAO?v83vUeh=NXaYu)452`D0tw+@&^k4 zy7H8O{Cfd-Jk0c-!sD0z$yI)Cz|I3j$X??EB?JFZDcz%OJ zl9UHF26QqbkBi{UT5yv2OXl!T$dCN1nTF4i+SPlRjju7i?~8(bbn(gHkF^JxmeZmjAN^b%b4ZjF{zQDl)N7fKSBY{hq_j=}r}!M;&0!b7 zn+NBCQ(dv()Mr`Xw5n!sntL{Kn@Nv;n`8#3$Mk^H^Fxt4f(__*#M!`~js_t!UV0OK zW`_lw`H;U~wrwH$?5+g#J2P)E?esUUd>3pq&^IUW9`PK&$M$diDUFi3@?dS_l zx50(=^t7xiMsLZlN55ZO%1or^fl}6x%%J8?r zmFe_6rn-y%SQI^v50_$IHI1GQrw{D7MbBz8-}mbJ%jhL7-*3r6&y(VJ=uhhDS>sEQ z1o@l_D@5wde)hOF|U*8*$}fI+>l4lGr{55KNGhBedAvP$fgi_ zHh08;n;+8i?BNmYpX~}n-;&1fQH!0P=T?lPKWCt4TVM_L+oI^%?$LldH1zCjYQ=u% zEid{Xty`Hb^z71J19z3t^WtLuU%06M8vP~T9Z8VS$k!VgG7=7W!+i{>eG`kThKC?6`KP80#k5!0HzPUF95lVBfF&m zOdrer0HV2H@PH@=o-lrOzTd$1*Y{{PJ?Ovl09JBAZ0C>HjKR~z{rFJGP7WVz<^=_ zIRglQG@k$?2Z&_gWnhp|U=;N64Pgj(1>xWj24^6{8N}cMvUCkWOdVfiJySgc9bZEO J5Up>_1pwDUjA#G= literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/El_Aaiun b/usr/share/zoneinfo/Africa/El_Aaiun new file mode 100644 index 0000000000000000000000000000000000000000..909c5f9682927c14e3e64e21da75559ad2e598f9 GIT binary patch literal 1830 zcmd6o`%hDM7{6W>4=RD6J;C|fOoId?L-?z!9 z=_we}^RizTFC2}sp&KZb1 zqUPMH>HTWX^Q0b8Q@5f4oVe*1aAMCg@Rrw>sK;WR)q zz4_70=nvZXeI4weXQ5#Z`oao&7O%d5{bJ)N`p^Dc20j#JMSkucKyL}6=V8|Y^oKnT z^d;s;;F4x~S~r)Xw-z;{KPp8sQ|S5S1n-y9FnZehHeug3osGRRdn>qXfS%>KJJ6S( zre|gBKRB<p2vTB3H#OaH=wt7buq{3dE(e|@QEv>NXKrsB$RPfOoMA8 z-U8QT(X&?b7=3LFJx`64ZdzopX=dgAacsQP(BaiQ4e^mDj{e!Mz<~TjQwkKfkl>|vMbH;yt1P1)C9)ADt w%BS@ErzS;!^1nu>2^Q*T)hCVeJXa@zladW0a&5GTz_nJ)ep`7J8yP+OU-J-s*8l(j literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Johannesburg b/usr/share/zoneinfo/Africa/Johannesburg new file mode 100644 index 0000000000000000000000000000000000000000..bada0638f8a2224a603f13afff16c0d8e986a591 GIT binary patch literal 190 zcmWHE%1kq2AP5+NDnJ+nLI`VN11e(yV$T0SkX!BO0HT}R&S!w=GwXU9K=j#p`2`^Q zTwflTf4(lTfRULA2pJfp9DuqRL?u9`Xc;g9Nf`wO79ZabhG56w5C$#~scXaq0I;$w A`Tzg` literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Juba b/usr/share/zoneinfo/Africa/Juba new file mode 100644 index 0000000000000000000000000000000000000000..0aba9ffd89dcbb47f1bf003dad75227f08d99679 GIT binary patch literal 458 zcmWHE%1kq2AP5+NDnJ+nLI`V71}b9#V!{7Fux;_JJ0N`w^TZ#3D8?$201(Yo`||;a zW{yt30HRqE>K=e-R@*mVKAS@Vn9nY+09MbT-~{G#G6aL=xfoQye6EM>V0rEbY+ydm z5gss~cmE48pKqx>SUvwr)&vG15NIm~%L{fq2lIu}mx1MlGfsl}B3{~HzNp7)FkehN z9;{wmqZiDV;F$!Lm*mI?^CjON1ItT&?0&!i1kxA0!F-vExnRER#yYTiiw0K(kbHu; yQ~(nr0m#h6z#zK>q+H8@5g3#*3JjbeHUqDZZwQ04V=#yaVQ>XvE+9kKhzkJma7J1H literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Khartoum b/usr/share/zoneinfo/Africa/Khartoum new file mode 100644 index 0000000000000000000000000000000000000000..3f8e44b8a6e171a0fde96736ed9d4fcde1bcd4a8 GIT binary patch literal 458 zcmWHE%1kq2AP5+NDnJ+nLI`V71}b9#V!{7Fux;@zkTwQ}dEyU16l0Z10ElL){rLby zGe@Ui0MRT7bq_!^tL+;wpUoiw%x9NZ0ITOva02r=8G^y`Tns8;KG(x`usrtzHZY&( z2oIRgyZ;54&$rYbte$@*YXSoh2(%T0c0XVM0_h9hV7|=7TrgjDV;xw%MT4sXNIvq% ylK>`00+5-BfkCbTq+H8@5g3#*3JjbeHUqDZZwQ04V=#yaVQ>XvE+9kKhzkHkp+^4z literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Lagos b/usr/share/zoneinfo/Africa/Lagos new file mode 100644 index 0000000000000000000000000000000000000000..3d7a71ba0e96de946446fc96add2f38a806a44a5 GIT binary patch literal 180 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V)Gwq5nY8wz}XVi0%nUU;xq6Ryl+D3j^O*FfuSP uGcYjggUkg2pdNM(1`Y-WJ^=vXjYC?MAb(k!FEz~bW@!r<%}!oUS2 Hbd9(GSdtBU literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Monrovia b/usr/share/zoneinfo/Africa/Monrovia new file mode 100644 index 0000000000000000000000000000000000000000..837780922f23fc58ff7f73930954840e9c63c908 GIT binary patch literal 164 zcmWHE%1kq2AP5+NDnJ+nLI`VN1}b9#VxIp%5LLBo4v1b5pEC!fpZQc&9wQU;|Nmc~ fFff2g79cqZtbu`n!^by-!54_#ftU+O7;pgqyn`TC literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Nairobi b/usr/share/zoneinfo/Africa/Nairobi new file mode 100644 index 0000000000000000000000000000000000000000..5f4ebcb7f9789c4ecda13ac66c2e768851113004 GIT binary patch literal 191 zcmWHE%1kq2AP5+NDnJ+nLI`VN1uA0!Vv+wq(Eb179}vCq-K_`^z2*3W3n2R7+qGc+ znVhOCj7*HoObiT4Eg%b&H9(rR3>df=7}VA<@cHK%IO73>-ebAq?(79PSvxzy)L&Z~*|L=^B#& literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Tripoli b/usr/share/zoneinfo/Africa/Tripoli new file mode 100644 index 0000000000000000000000000000000000000000..e0c89971aabea2c87842a9276b043d0fd946e34e GIT binary patch literal 431 zcmWHE%1kq2AP5+NDnJ+nLI`V704ievV!{7Fu<+AC6%c)Q_eKE_eNTC90*HQCaS6mo0*F>~*be3!`F#ZQja|&Z>P<|u9)RQn=FS9B41pmx8$fhW=9UH~MlfWC y(hweq1d4zV0|QSCNUe+lBQU)91Q<9$YzAH*-w+08*I*D4!r%(TTtGtChzkG|lxEie literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Tunis b/usr/share/zoneinfo/Africa/Tunis new file mode 100644 index 0000000000000000000000000000000000000000..ca324cb4cd26cc29529faaee4c0465ae0cecc8f6 GIT binary patch literal 449 zcmWHE%1kq2AP5+NDnJ+nLI`V70xDwxV!{7F5a}lT1w>Cw2=E8d$E-RYfav29^Af=H zZ6z@O)T0nEeR^%?2ax!g=iUM!`s_;a31Iq=7z3C-vjHrAZjmXNe}0k)n17-3FFmeE0F2KO+;~T;d0L0F&!5|`pfeT3J8gc;ufb)m! literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Africa/Windhoek b/usr/share/zoneinfo/Africa/Windhoek new file mode 100644 index 0000000000000000000000000000000000000000..0edc52b9b783827a8ac1090fe350bfe13977f745 GIT binary patch literal 638 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1uA0$V)6e#kX!9t0iv7S&S!w=GwXU9K=j#p`2`^J z)Yz6k0MWWV#}h!bUZ#uyh}N%t38EMbJpO_ChUu&gAij~t12Es%?KzllBKT(lNZeHI zB$#jd@gA6O&bAuNH@|oQ%(r;f3+7vHTm(2x8 z?W39nKn#cc05IRtDizFk@`nVRvy?lS@1idPmUsE33Ff=;eFO8|ZgGS8?mvVYKms0z z)hB>x&+A_rK(yClPB7nl`!z7%r|C7A?>l`5nD3W#7R>iAp9SUzIIRcs0~59bbu%yo zDNO|PgB@mq`61lv1VD^Xg=#QA^z{TVKb#>J%nv_Z1m;IPum|%aSBD5NGBGo;vXBTF z7z8*#CWuNfurM&lC@^p_FlZSt0!cmrMt-n}u#ayDgSLU8u>nJ{V{iyVxMK)|GZ1qD I30)&D0E>-r5C8xG literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/US/Aleutian b/usr/share/zoneinfo/America/Adak similarity index 100% rename from usr/share/zoneinfo/US/Aleutian rename to usr/share/zoneinfo/America/Adak diff --git a/usr/share/zoneinfo/US/Alaska b/usr/share/zoneinfo/America/Anchorage similarity index 100% rename from usr/share/zoneinfo/US/Alaska rename to usr/share/zoneinfo/America/Anchorage diff --git a/usr/share/zoneinfo/America/Araguaina b/usr/share/zoneinfo/America/Araguaina new file mode 100644 index 0000000000000000000000000000000000000000..f66c9f79d6cd4790c54d01286660f8ea0807f1c6 GIT binary patch literal 592 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1}b9)VxIp%Fl|+d0f^qg@A&{s|8-aZqIZ5Y0gLat zSE2yo-?CT-=HGh#3rydUe7FH5erIPSSpM#BQLy;E+4sQw`*&x7`42*j!Tc}N|AWku>3EsOJMcCR{Q|V|9-;;mjBaTy8!5R2HBH+ z1|V9l;`#y*Ex*8Y1Bg~IKED7&D>i0=<(0TkfceT10$_RNM+FKXc~$dIV7}^=<6yo) zLnT`31TlMRJ<*iTr2g}>!^MU!cM<#;h?fgD~`2o$TV1A&2 f0VB)*|5q0kJUymkp4#Gv)#Sd3?{w literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Buenos_Aires b/usr/share/zoneinfo/America/Argentina/Buenos_Aires new file mode 100644 index 0000000000000000000000000000000000000000..d6f999b8605c9f73653a16e2ddbd5a49b96c0f56 GIT binary patch literal 708 zcma)&O(?@*9LJwA%vxDdBx$mxO=`_%!ZhvRCA+X9CrU~waxf+2;-pquN?BvOI4E=Q z(l$1R;h@z>%3(!rgy!GO%j0>zE^a(ezrN4s|M@- z*%VN=MweFGd3xp@TAo`I9cG@}#iu@=JEacr&cz74zi=|lzxy}6@PX6@d~o3ke)swg zes5d~9|{z~hkG30eU}S-P#-}*G8IGrutb1A>J`HueQDsMO-A@=VjX-k73ro-j?Ke+k8AF%Hd_6<<3p8Qtkw+j4xo-(-^p-EKkdO z6|ruxnmmKmzB;fb5eHW;b}3km7=>fpuMKIC&Gy`%yqSh?NqfMp!9Im3BlDj-OZ;nR z;!NqOo)AhSF(Rfk8YU7-FJmGZrMC%@oS%uT-D)EiHdR_Zn`$;XB5h!&#%k#|fdER> literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Catamarca b/usr/share/zoneinfo/America/Argentina/Catamarca new file mode 100644 index 0000000000000000000000000000000000000000..1dcc8d85434c9d016f170cb2f16811ebef327b77 GIT binary patch literal 708 zcma)&-7AAp9LLYzm|0m-B#CTkL#^3Nm>%t7CA(oou3ShdMJ`MUxpAddT1stsyH%SD zFWJ}_h6}AWNx4{&J3{j`ug5uGe*ow7d%oxM`~1$ub6mZH119q4lCTM0e7XL}P#r@(W&^eo78r`!YHNsYko7EeZbe|K{YK9t>n4=-H7?_J-) z?~kkCBcT%bXs-u+;P-JF!i*jd#X&8+HKnTV=|om%Tv EKU&60&j0`b literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Cordoba b/usr/share/zoneinfo/America/Argentina/Cordoba new file mode 100644 index 0000000000000000000000000000000000000000..35a52e53d123b5ef5d293b3af19046630f02bb66 GIT binary patch literal 708 zcma)&-7AAp9LLXIFiTlcB#CUTO=`_%^47EqFWC(%+7%_G6uB@ZhCZpmC= zZDV5?F7(tUDHkhpN76ja>v7I^f54p6@A>{d=kq%k&v7`128|@+lCTM0d^s{-X<}p9 ztO_YxW6RrKo*N5p1JC`*E-TN2l1rTX%G_XId=%baG!^FFzqbh=NbSN07jNMY?;hcg zCY11@KrwvS=>{LKtbk7%BAAa%3z$DG72(hN0YPeo(!A4wPdXRH?f zD`JNK4tB%;Y^C4pci9Z4^Cl~MTavTc;pM4NkF4>m^z4DvDi2s=c>`-+$HCf)d;_1; z3cX+*p;pd1Z#`I_h{0Da^_25-i+GOvbs;^n)s>sh`x*GQ&kb;Uu)ka)mHl&P$h(HLwa!R9NqM-CfkmOPNkdUZ&Px3nL4q{_fZ7{K_VPz!BM%FdgDE|PnyG!l> literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Jujuy b/usr/share/zoneinfo/America/Argentina/Jujuy new file mode 100644 index 0000000000000000000000000000000000000000..b275f27c0287415674d2ccc850c3d612f4a45b0f GIT binary patch literal 690 zcma)&-7AAp9LLYtn6--)MUoU6lUjQ*d28B*lHIUUu3ShdMJ`Z6Zd^#Mw3H%mw_+~F z@;aLtF4k%!aj}p)OPZ&7Jg# zqbm60{Q`JjmlJ%lv;_9o2ha~pM9@DilHh~ga`@n{4nEXufe*#Dz~@sg_)GgL`j_!( z_^_SBhutsWXr&qc%GLu;G%Dc}%M$oq(GQjk8Y}&e^t_CIGS>#53`OBT5+m@R(Hi)# zfEoV#pacGABlTXti)JvNHCe^mvh4L%H>I*{V1=^O|Js0OV+q=6g?9ZbT4H`Pmzh9{rwRkaU zT%7({xs-Bg%4McpA8wH-H!@FU%FS#Sc=NIkek*;%NBb?$GQ2ms2ERRh4Zm}955GI4 zhu`yN!28-=;QhHd@Ij3qeg9|>{lhE;{-{F(fAnL54>Z`|1L0Nh$+#Q-%(006+0z94 zg@eOi$dBNV(F%WQ?*vEcbnuaR1^lM%0V@`RMBk%4%%dMowZlgPA^7*mApA$D68_U~ zh5y=ah5ufO{jZ-{E0|AKNaEkJgyklgQkUPmK$++Efb$J*aDnX=T<|;qF3L?YQ?KaU z11>Hsl!%S&1$(1hjlC%x0+-CR<&d{2$1-Kro(U;=V}0o=$w&Lf!9?sEZ^v>}aq53w zttNKk5Na(Y=lf2^IQIvchVy`r={Ua%s**Xs3#$zD%#xcOPG%QVX08xZF2=(2wc@G1 GT>lG4153pK literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Mendoza b/usr/share/zoneinfo/America/Argentina/Mendoza new file mode 100644 index 0000000000000000000000000000000000000000..691c56978a033586e3302db2ef600e4b0ffd6366 GIT binary patch literal 708 zcma))-7AAp9LLYtnB`(cc}Y?TlhS6Um>%tdWH&5oS1v?KkqeZ!+_+LJEv2^RlKEL0^b9x-k-fkoLbE#MdFTNaqk62k- z3ad=Y)}Uuy&2wqiRmpR6v{m4_m3uDo+|GA_x331^ce2JMe!sJ^48I#&gWsFGf#1J< zgg+S3!TWc!;U%XFeCYLpk7{M~%M&5=ALl9XC!K2elY{|2&|rZNL{`CPQ*QX6eG&b^ zmudJ*JB7a#pTXfWGyIjU3mmm-;iEnU{I2N(D@MJ*zejoUp+A;kgO3Hm@E_4(_;|P) z{!=!?f9dUMS3^5*zyK0ejNgr+3 zjbZGtRwF5g6}b_bxB2^cp6@PhJWs#A&*%MopTqlD`-cW~*r9e5Bn7A4zV2&t{$QQOhd&(Z@OX zn1#Z}ybs`n+5mrHwt-V7Ief}3f?s9BU{R+O`2UFaZuHYdX83d@0soe=!@nmQ;XlF# z_|HHO{MUNsy}p+XU^=fC*xQm^Pp6lsyn1AXXO+_ju2wq1HO3ck&C@uzwz5#md$sXC zu$nxB)!t^XCYb=&E%jEg8ZnBexZf1iAO(M>FI?t_xbLv%;d{r;Oob#X`=47T{k5}Y zS&S$RstBPp94AsrBOxNE^fE3fp!7B=QSvh>=(1RenN7V`&!&Nmjwo8$sjWfr1Hu4G Av;Y7A literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Salta b/usr/share/zoneinfo/America/Argentina/Salta new file mode 100644 index 0000000000000000000000000000000000000000..58863e0436d16ef8ff8ba3d96b452086e4ae8ff5 GIT binary patch literal 690 zcma)&-7AAp9LLXN8?#nc6iFh}+N9QOCT~rkyA_WM zta%$V54%{aO;Rpa~iotD7_YW`pdmwe_{kaP&^gn-vfJ_@Q3ML_@l*J_~W}r z_>&0@{OMr{e9+?spRKHb&znN%ho)obUzEx4;XWmNIAemB+U)RBatC}h>w}ND*3pl= z%)v)p6h10GgX2aUe8SlePPM4vQ>!xgT{Q%jEjkDPANgq&{dA!dJ}t%JKT_lHpYeM5 zuaFJ?`=}fKXDj<&nPnT8&RZSqZAso{hsaZ{A70~G<=X@6bv|&l{S93GItDgW7MOX@ z5bFgS33YHbij81XG7ev})KkH~+vQ8#Z#Xp}+sE^>c|TJjG>8R tl!jtNNvRYhYD#Znf|k;Uq@d$xqV06KiIYvO*~+GljfH5M*{QWo^9#6+N67#H literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/San_Juan b/usr/share/zoneinfo/America/Argentina/San_Juan new file mode 100644 index 0000000000000000000000000000000000000000..7eba33c1c5b13cbd9b7566f450d524a45cf8b65e GIT binary patch literal 717 zcma)&-z$Sr7{||SW0ta_ND}$ENv$!HU%lFelHIUUu3ShdMJ`Z6Zd|FAmQpl7Zk5-? z(2R{?C|ZrAT&&0)p?RC1$9cZ~0G`v+_k5nu^Ip8i+1cA;VSkoNY*14<|Nf*=tR;)i z0EAkBT=75MGMI=p}O3V!GM4t{q; z4>uPR@P}O*_``1#e7MO5AC9eok0;&mr;a7;pFU2( zpF24Gx%>c*8m;gb_HJ;zK?fiADBxFZA6T&%B>Era-h=%_h8;c;j>5mihvDC&)$ku7 zEBvRw9sX0$gj!3Z$?T#l%vGW*MO&D@Ufdch F^*=7fOT_>H literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/San_Luis b/usr/share/zoneinfo/America/Argentina/San_Luis new file mode 100644 index 0000000000000000000000000000000000000000..0a81cbddfa2813041472b716baa91c35a8451379 GIT binary patch literal 717 zcma)&-7AAp9LLXW53_c$qP*tDG?ZGinZkOsi?Qs6UC5OSDW%8-N|YN{YQ=Iz8*-;i z-qtpZ#|)uqBzKD3Q8Z8UdYtq12k<-n`kv4E{LaNW?v9>r6Zx|gY=Sp0_up4+Y%G&? zE@d?^yRy!6Vaj9VxjE7*^4uys4)6??c)-ESe)v${Xq2CaHWuN-=~ej1%r*S>%{~0i zum*lNoDU!E@PPN`=D_=P66U3`1m+KlW%yX93O@E-2_J8?!pCn{z(?a=_!HMW=1-m` z;LlwY{ygvqPF7gpFYR66RD&8m<&(j$LN8c0=|uh>`N4hzSN!Fq>z*DX7^YbkAZh-YVFSyM50xtVn0vif`?-|Y{ zoR>R_qJ))IJ_Oh9RwBia580?RirhPfvcZn&Pd_->3T}EH6gfAqnZeGBc2SX`{O1x> ze6e9cDP#yLeodfs@01Wqr36t?8jlh+rB?}smeRXhg^uruw#DTpcGgu!GwW*BCZefl IJ6pBp2Vy!-;{X5v literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Tucuman b/usr/share/zoneinfo/America/Argentina/Tucuman new file mode 100644 index 0000000000000000000000000000000000000000..10556d5d856a0f33afd8da2b07a2005e7be80fb0 GIT binary patch literal 726 zcmWHE%1kq2AP5+NDnJ+nLI`WI2P$I&Vv+wqP&8-V5)i#;QojL+-c}vt0HU``o!kJT zcgXdF`8%!@faQ0I*B$_g@7lT;EWi85MzH*zY1hH>dv87g%kQh;0?Y5;EdiE45Y-Rn zADlZE%s*s(7_9zq-374vBQoE>@<$U`!171`X@TXBJDP*#k3U!s=AUSs0+v7JyAZ7Y z)VnsY{5jwMVEJSmlVELb4%E9u#E}Mbne;+ml%m3LE43_`91`=NX=9q%{|9eavfMLtPzSwI6 zh~`kqUjU+&r)&lDRRpGh`Ksohz X!5N5k4NQR87>JD+xNLwdJ7X>YQUg#g literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Argentina/Ushuaia b/usr/share/zoneinfo/America/Argentina/Ushuaia new file mode 100644 index 0000000000000000000000000000000000000000..e0317502769271ad0c038493df2ad2b90ec402d4 GIT binary patch literal 708 zcma)&Pbh<79LJx{#*DI}ND|r7Cbc#*VS2U0O6I_doE)T-A_tU^iyYKSODP(5Rkj1> z@5V43v>Hh{tjLYfyv@Hop6Bc0HqX#7vE`ks1LgTiV3s~!|1?yr_aK(Ik39Avac!K*i0Uc7(hBNWqb~{lbk*57~%VmFd znq10=(m;X`N<$GMqcj{O3QDgcl59%vViFZUlk8@@gIL*A>Z{lo*%*kjo}C(u${*+O BOAY`4 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Asuncion b/usr/share/zoneinfo/America/Asuncion new file mode 100644 index 0000000000000000000000000000000000000000..622503674225a20bb6fd3cc79d149bd7d354166f GIT binary patch literal 884 zcmb`D%TE(g6o+qlQwtOjYI%r&Se14lumAt6K> zHGv($jSEC7Bm@@9u;LM*B&Z8aOxPJo8iJ7kAzbhM@dvQ++?;dncfWHMGl5`dM-@3W zbZmkrkHG0Gem0iO(nwi!_GL$SpE3Q7@crb5%>$Cm++;JH{i?erGm>FAA&C`F3eYW zT;NN2UGSEaIk08#9sK2ZKln35)uk z2)ui67ck>JkzYlK$VJbZLhW)Fet5G?GT? rw{>FRRcG+}0>s18CMqmtqOW5&x5BFIw)!MdkOa{#T79yh@QeN*JnXU; literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Bahia b/usr/share/zoneinfo/America/Bahia new file mode 100644 index 0000000000000000000000000000000000000000..7969e3076687a35835653a348f0f3c8c0b2e1821 GIT binary patch literal 682 zcmWHE%1kq2AP5+NDnJ+nLI`WI1uA0(VxIp%Fl|+~42a&r@A&{s|8-aZqIZ5YF#yrK z?v*Hj=vx-+!2DaUe}U;ck`Fh4#P95k1k2z3EeaODH~Su#fB)_*F#kb_F_`~l`hT$c zudH!k{HqU9HuZUE5=#^)D+XvM}%u)GrY2{2zdLI5nU{HQmUT?v4Fkjzo8JKU- zPzmN6%KC!U8-*)?^&7Kgf#ppsLcsDSKMsQVW(x9PzS;QcC>=!E$=@D z%Ukv9faR@E{0Gb1 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Bahia_Banderas b/usr/share/zoneinfo/America/Bahia_Banderas new file mode 100644 index 0000000000000000000000000000000000000000..48faea2ecefa7dca89c7b2f5e0bfec6b47becf69 GIT binary patch literal 728 zcmWHE%1kq2AP5+NDnJ+nLI`WI2P$I&Vu}Aiuyost0ua6aQ{Dp*y)7*)0Yq&uKy3^W57vYEkzZ@T{HOyH!Tji} zabSMT%5@-R46$1s!2Gz*31EKwR3$J!A+rd~Ppq^10AeJ0hJg9WaS9(8nHZUYm<34U zhOA7u;Q#+~fo1{82@EX%|F2%azyTr|dH(pNfsf(S128?M=K_f4pUwd03zX!6`GRGSzuj!5Hf>F5bOW{6VeO}|NmdTz{v9d|M3G19RL5HJHg1~;~T=@=mNySAq=_( N#>NH=TtKD?7XY7HQF#CW literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Belem b/usr/share/zoneinfo/America/Belem new file mode 100644 index 0000000000000000000000000000000000000000..e0d7653c64c1e3b3e546d4c5e7644865b237f128 GIT binary patch literal 394 zcmWHE%1kq2AP5+NDnJ+nLI`V-1uA0(VxIp%Fl|*y35edo@A&{s|8-aZqIZ5YF#yrK z?v*Hj=vx-+!2DaUe}U;ck`Fh4#P95k1k2z3EeaODH~Su#fB)_*F#kb_F_`~l`hT$c zudH!k{HqU9HuZUE5=#^)D+XvM}%u)GrYi3LoIc;Ns4mwFf&{{MgcfRW|@|Em`m XIDC9V7<3JcfY_LU%LYi=8FK*u>AtJ- literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Belize b/usr/share/zoneinfo/America/Belize new file mode 100644 index 0000000000000000000000000000000000000000..bfc19f4e587cadf6a2b05781860c21dccdf02961 GIT binary patch literal 1045 zcmb8u|4S2b7zgm(=31^8At91PEQwMo#v&_%EM^c=aMj2w$j${){ZMLDLV^7t1yN8+ zl>X4vlx1rS*z4lW0+dkJ@0=&e2(Yy@H*bl=YBf#iL+%! z#iGT?32G|y;wu(8woL9dl3aBqK_^YCb+<^fasOd~W>fWAxOwY&j{LYpf?ISf+`1j+s1!9cd=z~SLzzvZ8!jThwC}YxmV@E?*6N=C$SQKVLb`=1ao=H^;Q?aFFh;Z zzEgU*|KSuoP@sYbtKP#yo7M@m_loO)hnF+3cV`{!jYVOfzFnl8&*z2x%stp|v%zm7 z7vZ;ehdIiP>|GBBa+2lb!0QT@=4kF5j~Oh&o{&Bc3!cqzFy04`)$8C;U<~(+S0&(2 zu3mV83&7#pN3ghWhNF8UmDl0V`j2q*hz0(_bi$LyLU=NAAC6_0^0XHlyaIonH^K3y z3`v*$qy&vVK|jz zhf{$Cj`n6%ci>sq1pFs@0iLTJfagbU^ORetZ06|y&{#q|rso4oGpn=$&a&@dmCO5yEoedy!egs;9`9F?d2Fw5AdH`1cYb6_4{`VUZu>7Cy?hPP+%ATC# z0HWn8o`U)E3!D#t_zK2%!F|xB>&i|NmDnFtPyI2N*bfd_x#?4UB=Fw7UQR literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Bogota b/usr/share/zoneinfo/America/Bogota new file mode 100644 index 0000000000000000000000000000000000000000..85b903333eb6325aa8343f6e9aee38447495303f GIT binary patch literal 179 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V)Gwf&V}dH^<}yh@KGI^|Hq*3RTWfAp)7dYpO)VS^J7IZI2&ULgR#bFRoze=g zJmgI!)2$$ksI+d1K~16v`f;&tvcP`a6c!N`C{1^IpYK25P4D5^_xU{MeP9$`q?DRJoyKECFG#4`zOnYJu&N^(B$-1@z zg;F1xl_|69(y+lh2^;Pe!A3C&8*h(cU-)?qUhpxF_oj)*e4DX_$sTyo!#JFKGlu)( zl^%F;-#K{6$pi4xu68(YZv$-JUJvI7obWQ|YS>Z|l4($26kw~?0b75SDKxizHp2E) z4qQ0?4PHJr1sBC%!Ntc5vA^Q%UASbo3YQ*y$>^-C`UJ1qaR)9lKY<-C1$JaUpm7RE zVCUpG?3$9`HIJ^t?l;{s4b~2whduY3;qud+uy>#m_I37(bkBb@AFgQVfGeA4;3`KW zyw3j)t~R*f8rwAAVyxzi2@a$u;M!+D;Pvkl@P<)Ap=M(u3UBKF4sRYj1J@mT4R7fk zlxeVa=P10b{S+K5zXXSZ`{B^{5y^+8l9^4%PdD#Z^bkw w{POQQs<1rtmZq@8B0*leBo=Pr72!oap9#FF=8ZdC;qiOC?y%42@p-($KY$7DK>z>% literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Cambridge_Bay b/usr/share/zoneinfo/America/Cambridge_Bay new file mode 100644 index 0000000000000000000000000000000000000000..1092f4b61a1b203f7feabb586b51085bb72602dc GIT binary patch literal 883 zcmbWwOGs2<6bJBcbezX^s+-U8m7|u^jN|pr`0k;WGil+_U^k*RBKSZzib3F_y1o{! zyyz;#aB3AnPP7ssmB@u=3tOe6(LN7`A<%=GTm!ndyViPKM!gZ^lJx#20<=`N3W|uDcnIZ)<`R9@fB# zw{O8o4neiP0NFT#!|8Mx2t znSitJ>u^r{7e;Zh_!oTX&O10a@e}NHYq0ZZ4UJ3af?cb#uzOR1^FF?YJ>NQ28sxtm zfTa)haKW=ySRN^Yy{-Ks?fD)j!G$#~a8dm}TzI1P|FYI zcc{5y{2fA_`-8o!D^qxWEh1>tT%Q_)D~7h=%F*X=RmWHOM*pZvgPV6FaCOsD*k3RV z2mB3i;O}QK+7K0OJl)R}V>TT-rEfB(>u<*mM*LfJeN1CE^rEg$MhpqmGduMxJztht m@PWdDA)fbm`W049$@>6Lfe%ah&=V|_e3I-5dcBfYl7;`ZnXHrm literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Campo_Grande b/usr/share/zoneinfo/America/Campo_Grande new file mode 100644 index 0000000000000000000000000000000000000000..6855e4e9fe021cbbc392c76e1effef86dd53510c GIT binary patch literal 952 zcmcJ~-%C?r7zgloT0@o=K@eiI*$7*?d2|O|%k1dTWx3VrG^gvLA7F`6P*KuFSP}+a z1Sb8477=7uyAV<-c%eWBl2Y2ma6b^dPzE(99b0yKpYK25mCxZl51;q@-QcJlU7giz z-O-5#9U680p9DoMUz|cs%;WdBW!hug+J0fLdBe2F(~S!4iTFKLGA zJ@Q;?2lBszgJJqkW8|emyR>%^-W_srvdJEU%kJJ%$a}W@fX#tYPBt&xk!bIAFpfPt z2bY%_6>|BfH2M~%!It4?$oDUoaLNyKE66MOXXMt-Z^&(-w{T_iC@l32z*WW|`qgbV z&cxXDy~t(91%)hUrr{cs6|R}SiGJjsCp%eL`ND=b7tGnRCUtS@v z_x^*A3>CtPEeSUa=;6klYZ4RV^3A}m)dbw+InU|7DVamxy?q$D`@$^PpK6XP?vk)OJF20qO!u7@^Wxs!~nN1#NdtxDL5Fv!kL(}m%mDRx($0YZEA`!O`Dt1ZPK(!&I(#RDzi#< Nab#ww6YqN2@E`026-EF6 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Cancun b/usr/share/zoneinfo/America/Cancun new file mode 100644 index 0000000000000000000000000000000000000000..640b259fd0f87a34f03554cf34b4346cffd5ef22 GIT binary patch literal 529 zcmWHE%1kq2AP5+NDnJ+nLI`Wo0xDw#Vv+wquyot41R$G1tnDh8HcU_d0OA`J{Q~oi z-95p4lb}0bzNxx4m~VQ70n9fuI#U2t&S1_i1ELr#q+fvLEuQ@Y^DTd$0`slDvNV7M zthXHk^KI7u0rPEl_ksC#{rA9p``HCxzC->2FyFDIw*aV(!O4FSnD3mD59Yh*w}APs zE`eaa8-E&@@2+AD=DYuBW&isBx@ w{Qtjt0Rzkb|Hlt7a{T|la{~hph-4J-@eN^c4h~^(bpc`^?F^*3fDBVE07!Idr2qf` literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Caracas b/usr/share/zoneinfo/America/Caracas new file mode 100644 index 0000000000000000000000000000000000000000..8dbe6ff74127e02577fdccd694af5a61580369e5 GIT binary patch literal 190 zcmWHE%1kq2AP5+NDnJ+nLI`VN1uA0!Vxj*)kl8Nf0HP<$>DYkiZ!_L_fXs1^o>Ty$ z!&O%nFfuVSG5`O6(1C#gNV+hv{QrMo2Ls3d|Hlt7@cH36=r&*^t=SE=b})3ZO9Bqpe6DStmn7h~R{0=QT! zp2r@_t=FzwN>5v56XlNS9J#AC{O0%Q3w=MXy`O^VdwqK-<1KaymQeNtCr0M$$Oiqj zlQPLC3Qi7rC$i)REu8Xo1*g9GyQoR?oWbdC4V_==lS))mIxzk`Iyp)XUwV&hpm^raKW87T)0~S+fKr0jLEY}aM7k3 zE*=PmOD68&(&j`LHD#U0aJexER&48VMd&A789f14u^ZSPxay<}`|TlI{WcEQ94*1M z7oBk3+JTPd>bHyFhOtGsaV8dS>Ttr%Lo$sqht&bMG{i7TC3#6Iwb)*w`PWu)J}-Wl l^92`EbH1_6eCd?5obS0MolRDlT&^&aDA_Dhlt#dy`2n!Kl1u;q literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Ciudad_Juarez b/usr/share/zoneinfo/America/Ciudad_Juarez new file mode 100644 index 0000000000000000000000000000000000000000..f636ee643fe49a583fb2db3ff8408c341a06e8d3 GIT binary patch literal 718 zcmb8n%PYiD6bJD88zY(~CfSh`r8I^a#``_Pc>O$oromu5A}JJEky*%OWmwpFWI+}d zCTWneV<{|zg%l!LphS6G_k8^Ua&G7MJ)hgTKc%s!%f$XHNo-J4DSto75o>{>!?~yx z|NQ{v`b*yxrN7JWqTI5aAh)%tzxg%sME^H-4^uGHVDJECvduxkQfePyb6kmzoNBso zQ>F#Q!|4%kM3#Q1g)=_R;mp@CFAZ7#V>sKVfpc~j;M}Q4IB#wY&hI~j3&!W%bWvF4 zgDst-ur+Z8F0!`5#i2v6Ew%u*y-(}JGghjOflJQ@;j)`RxO{#E`xU27SRV1fmHu3~ z%Gm=~&ql*F+2wHUunMk=On{a88(8@ah3)18*nX?mF;R}FYYOJr4}lxL_u!>8o z=k<(nzTjnQ&exV$FnuL0=Q}=0S0O7*u2Yyrv}_eAS|cvf1oU#U!DL9%%SNNYXh_oh E0Js*Lo&W#< literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Costa_Rica b/usr/share/zoneinfo/America/Costa_Rica new file mode 100644 index 0000000000000000000000000000000000000000..08f0128ee681d8f7e1df186d93514f3f4cff2830 GIT binary patch literal 232 zcmWHE%1kq2AP5+NDnJ+nLI`W&0xDwxV!{7FklC)~3!)dl5c37;7c}!s0Mpy^0zkB| zm^PR%JUsx+SD*d>%-6`S$+u2*F1Fd0wXgM6#oCe(U^e&OtSp{zjFg4=l}n! a7clVp_=Ye9djSb&7a$G}Vc-H1W?TTV6)k)K literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Cuiaba b/usr/share/zoneinfo/America/Cuiaba new file mode 100644 index 0000000000000000000000000000000000000000..c09a87558d53b031fca84a4c92165b01b37da360 GIT binary patch literal 934 zcmcJ~-Ahwp90%}cW?_HzCj zr}xX#UC1LDBi=_x6L2i@9*!$@@ShiX=>Of_1F!RbVUzzQ@{(VNIOWH?W#py&Gjen1cjRS(cW`;*1S|~>!xj2=^ebD+ zI1^*h4j{MMuF7O`#04{qVU!!r*%Hezst>k95S#53qS_xq7MC*LAJoem;zdj1eT6Mh1p9ejg+ z^UN*Sb$JMOzw*N8ngZybAG#?sF&={x`Gsqj;ET)zD~@Vd`PqoR*O(7`L&soWRtENs z>)_Uv2;BB40k=ncITO=y{hO4f*`Y^OzxFVus*CfQY*n4*ET`F}FtcP4$I5gy;Vw?wg0Mk;3CxU6|J$nT}`eoLv1Jkl|=7VXuo(W)DzNQgO zE94Y`X~mdiFsJhA`+F7z42pgFBGT1tbi(02vZWm;e9( literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Dawson b/usr/share/zoneinfo/America/Dawson new file mode 100644 index 0000000000000000000000000000000000000000..07e4c5f4ac3852571b17cb33fe565a5ea2c49f0a GIT binary patch literal 1029 zcmb``-AmJ96bJBUOI;3yLB7nj*-xj6OCq?dJ5GC_ih zawO$NwSG!B(T%cje2On~;L)*UgnRmY1)S9X?Bh-z zun2tqGKHgjE>?`G`0p!fzeM?5)pK0nGcVYIeZI>N7u4I}LSr4QF7+W_l&yv}ax1J^ zu!xLm^@l=On=F8JkAK6(6N~Vg(HU3>R|ynnB?FJ((m*b(?|rM{`!efSxV-ftyf*(8 zY^aREhV;BhF=kXoVB_oyxbpKsxGFILuS@kud9FG(4A;c>!>0aIaP4q2y#DYNfnv;j zq72^PJPBKTS+La*fa}bkV4K1Y+qIc0ddBQ?8o2)N9Nh4132vNu4mXXfMT)VFQ+MG_ zLx14S*Dt|aj=h7o4&I6KTyuK@-qw8)c9=xC#c>pF`H>PR#+=m`@ZOo4gk8BuU{`zu zZk=y~x8I116ld-?y?F0Aa}{p8?}pn$r(y548hA%j5Z)P9!9Hyx?C)5B{YyGHV0{e- zJ~jx9YIpH>73Nbd989O+&f95t&+H@|8hj6TB}U-A-A~|svCucUjJ_2a@=SS_;(vcD z=`ZAFOp=BovJ6QY=wq~@dk#*OB;Ab4^7x$<;jZH+D{*`LEa;&2QSYMma?`>~3olI% JO(h*R36>8b2{hOQ;)gcYRO<>hrn-8(J+U9lE<$_ z@k)^SXeemUr5s;gu~SYsbQ0y3EfIDmzqgW|O(|N+z3LZ{a$oep2id#uA=`#sx+U1< znS+l)JLq$~Cc!7}Mfh}PR-!)c)e-p2HVAvhJK%F`D}2#a2Va&{!dDIX@O5eyd}FK? zsn2a(g_hE*&x5_MnXoT93HCX4@ZC)azF+u)A2vMjU|5p4#E&XrAiJ7uKsEGYyIh&Jn`j6jWEiiOmqpqmdH1$No29t?|!3JMIT@BE+kP3RlWobx;1IWP|+A82au zu{n={Pf*a2=U%DhW2rncbbihz#wRIv-5pdZUyGR(%G#9+uoiEFyU%@wdm?F!?t7b` zz13<-HQ2m!LJsYi`QkL|FY&2=3d#~(&sZ{UA9U& zweqh*IjwvKHhB`T+5Qf;h$FDThGF4*H#~nb3R@?J`8Hzdvo33$V!Z}7%9F?iFEpi;3p)(LMp{}tZaaSAR!JPvP*bSTu= zzHbQLQGWss7F~ox!Gmz<=R+~Yko3$mCL#IaKWbgStTFzZ-qH+4UGG$x8MPH}ac@{= g;UJG{9{YJz%1q!W;Z1kgFZm>oJM8sJUdbc;1G${^$p8QV literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Eirunepe b/usr/share/zoneinfo/America/Eirunepe new file mode 100644 index 0000000000000000000000000000000000000000..7da4b98fe3c70a1aecae8e0f4264324eaf9e1fb6 GIT binary patch literal 436 zcmWHE%1kq2AP5+NDnJ+nLI`V71S(?zVxIp%Fl|*w1Bl+ipT+>D|Hd2u(K|l|1c2yW z_a-=i=vx-2!2DZp#K80&$-fss;&*nIg5~f2HUx{`oBa#SzkhcdnExQeAI$$ULmI69 zD{B>)|Ls5nSpGYo)d7$>KLS0#{2#|3g5`g4y#uTNwNeBu|ND&+SpHA<%mYBTGsvD? z6#$~;Dn1_o(eeudFMwzToA$r~B=3<>59SBevm9Vz w#0#03{{P?Cz`*eT|M3HiEWn`Iz`y}wGqCvhhA`+Fm;kXU1D6euv@_)b0F&sY)e9Ine0)O~oLzu8ID~-q@K8FPQqle5E;~y1PLWw;WHnYqu~{-1x%I@{MtS5H zjdj^smZes|G)AnNbSgh^DGxv*NQCPuaOHZzsgs_EsohrPd5mxK9*h&kMDU1|B5Pse{VPkPk83RlP)EgpPHWnPn+k#)01a; zw&zcO3Ov((0RH=88$4UBfenvbIrcrtZ8gu5{^KzKJ6=tm_NmdC$t>`K4t%t8;e>;RX2uY;!Ub zUYL3mwoQzO<)K>GF3=ygSNp+=6>$QgvB*LJE2X}$a@0p;^~JsRutSR-yrf|YURpT` zFMH4l^I2{@Z70jm)WRzgtYOEr4vy8Ge1E_z!=A&=@@81&S`4dZheg^()UsSy-TfAJ z9oPrE)m6f)T5|-}=U#jr_R#HxJ#&u3tFLc{*BrdY(>CIj=>&Ugj=?^0rm(Ln0rvCi zhyBe0-~a~`j*gLlJ|!IZrwuMgu>kFpg4R^1=8`HbsO?jmP z>)RYv2XEPb2@dfT;jJNu;jLq>JZ&Qy_luaIQpgs9J4kNj?LoWIEP?Z8$SwbXO@UkiPXrLUjN5qVlZ5uBE(=Q r5+ue3LqRSv$Ga77`coDO#5O!aOQJ*QiKAx+J<(bcLEmNc@|XPs-b?Lq literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Fortaleza b/usr/share/zoneinfo/America/Fortaleza new file mode 100644 index 0000000000000000000000000000000000000000..092e40d70122f764fd2630957be1d3e32858f6f5 GIT binary patch literal 484 zcmWHE%1kq2AP5+NDnJ+nLI`V72P$I*VxIp%Fl|+~1c=_j@A&{s|8-aZqIZ5YF#yrK z?v*Hj=vx-+!2DaUe}U;ck`Fh4#P95k1k2z3EeaODH~Su#fB)_*F#kb_F_`~l`hT$c zudH!k{HqU9HuZUE5=#^)D+XvM}%u)GrY2{2zdLI5nU{HQ4AyV?$qUT4KJgzcZK`~3rKJd<= zpagGT^5#$KC>Bedq*L8q8F2F%8f#Pdd_J)t@%jG#S2&XO_ZoLZ`JwWuh03sx2E7vh zpHca#@EI#b;JETRINtFRHl>fkTg^SNz#hWFubc2T?FO9i<$=nm62k#_`}lQu$BPz? z@6Aun!aF+};9af7@a|v{oD@iflWQ#S9`8E5H)jprmuZn0)qc|woMKpmQ&v_LzPCh| z;MBQAIBj|wJ}?r75BB!K=`FuCinEM6ZE)t9PjJ?iUX|~&J+I+Ir|!aslOMy@+>5Yv z{gpy7W)rGm+u|cQ_nQqqGSv#(KUPURcQkY!7Dsd7yj!KPqg#NTmjW8an5+3aoL^l6 zyH9_BJ=Qe1z%>jP#_6!vGON-v=3S1$MgIoj;C^RhvyAEbXVqY&dzhJU lPrzxe^~C1_vec)(P8&HouX582pb*}&*=aF literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Goose_Bay b/usr/share/zoneinfo/America/Goose_Bay new file mode 100644 index 0000000000000000000000000000000000000000..e2cc3eefc273c206ab9d88f94660f587932991fc GIT binary patch literal 1580 zcmb8veN4=890%~EDvFo zG4xl+<}jz|;h5QVDVI`LktFIQ!qxeH-hZ|E!}|XAz4zz!`F_5?ziz+u4Ou%Qxc@Gm zP0*&5{{Jf%*_e=RUkh8CqnFL4EK%p3p)7satfJJED6%Q5)M5!`b?(3|%BL6I;Afc) za81rITpLvh*KKuC(_FpBIanJz1V6XB8%X^ZK27k8t|Is)cOTZz`F?=T^~xSCWn;d~ zK>0e!I+3zzw?Et*^Z|a8D1Z(2^>9l-AKdb(9By^7%b!!F8m%W@Tr9DozKHU?i?%}JPJ=X=D-duMLLcx z$Er+t%7Y`YQ~6;d^_`0|V3&gRuxsuT*expxo|@?mPm_DW(jtKa5l|_mc+oKN(VSB&le6q z`xO@NiZ;_+#6carAYnGVaP?g{GJuB{MHIn{ZM$KK*X@3~C+Vq$qyC(Qm(<;am$n{) zmsQlLXfFEEI(T{E4LIhq1diRG4@*z2&8E4y)IIQu9gAUESTY+^Z^c{NjC*V+jl=kZe`|r=1Rnbd z%(C~|v9I4oj&D~%X6IyHuscgQAbGKN!jl6fVBArWF p!?uj=G`82Lb5d4ISx+isg^*PXStmrXKolVg4^fE4BC#l3_!o8Gf8788 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Grand_Turk b/usr/share/zoneinfo/America/Grand_Turk new file mode 100644 index 0000000000000000000000000000000000000000..9d90e745b04fae51493817b5ba1db5015a39bfda GIT binary patch literal 853 zcmb`;+e?#S90%}cbD~V8ELWZ~orm$x`R-uzP*zSi=G9@e-7_*!K$d|gO_ z)3t)1)k#KT6wXv8!I}TmLHl$2GKLQtN#$lbl3)Y>k26<0V`(WYVGpzqr4i_&C!iKQyXEjnX7J$XsGT8XW z4Vyygu(_in#(S2R|KU=n3%=F74_kG`aG7NZE>B2-E3$SYgiXcKU%2w*8+?0x8@{tQ z23Jk~3G&|EuYK^nw_EW2_w8`?iy7E9(CcS4QsW(kYac&??ZzJ1VXuW9#}hGDBhHex z2r@hjyHaehYxX%@AI*o|ABJ%6*{SyPzVx~iZkX4?-iH$0_)Y~kRT<&t?jyJ*I~A6F z-(mUW7;gO(jwzIJ7xby(C|ztMgwh2iQBnG3iX>9Hv8+huFS+cIWa4J)XklxYiH)V2 U!OCEeN=1ukGDv2#XckTCGwa!~+yDRo literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Guatemala b/usr/share/zoneinfo/America/Guatemala new file mode 100644 index 0000000000000000000000000000000000000000..8aa8e588e3cbf963193269ae01eecfafaeb02b50 GIT binary patch literal 212 zcmWHE%1kq2AP5+NDnJ+nLI`W&1S(?&VxIp%Fn{i=J0N}Rp=%Pr^x0__K(wSz1(+{+ z{z(9cum0-Y0}!ooA_gq)5)zaE;=9Uw2QV>0;s5`uRTvol|KGWRkp;+Jz`)_-8^Yl1 O0>r@~3|v6Mj0*q+L?#pf literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Guayaquil b/usr/share/zoneinfo/America/Guayaquil new file mode 100644 index 0000000000000000000000000000000000000000..381ae6c463260d85ce92d6585b6420fed0c096dd GIT binary patch literal 179 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V)Gwf&V~|*{&7=qPHz^k^t$~7W;DnOcy?LU}R=u x{{Mfg1_J|7K7)bf|Nr9$7&-p`-?@Q-$HzB>ArOdl4NQR8l!40zNZOfl0RUr$BfbCt literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Guyana b/usr/share/zoneinfo/America/Guyana new file mode 100644 index 0000000000000000000000000000000000000000..bcc66881c17cebf8767b7a147b1fcf7ab29bbd9f GIT binary patch literal 181 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V)Gwq5nWINtVAIM9;Wc?En;G;Hqcc1EMvrIvikR zVrKmR|70Zt!~g%s4=}L&|9{$rf#d)Gs}~sfe0)O~bPY^^*x1ArL^5#M0Qq(%TmZ0G BBpd($ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Halifax b/usr/share/zoneinfo/America/Halifax new file mode 100644 index 0000000000000000000000000000000000000000..9fa850a7d4c36dea84149bc0ea2fcd3581d61a8c GIT binary patch literal 1672 zcmb8uYfw~W9LMpqinMJecma&XKqUdgWf#E^G0-5!3wlNtjT-Ar(+!)Hn8>UKb;^>N zQX4A^6R+W|a5vB(0vE50c3D6P3YUX6KxDm~DXg)sn+zKjO<-6}TzP ziGPYO!p+il+!F96Zc+1btLF_x>|Z(jiY(Govl6!zF2`zdGH%aFz*h?<<7*3oaYuTn zD)u_ZO>~RwiZI|VZ$Iw#y@tE%Tk-E5XYqAs4fbv=QN&*F`a)UcjWwI`&8J?(e=l8y z|4Gik|HdrFw<2@c@AI?Ze&ZtCe`}#Co^!iv1|DdR#)EZ!c&K6w)((2z;{PD+=ut%& z-fhGq);8dgxjnL|`zU`YB1g#$*f*sf-(@Yw#;`JcxBti3Bz=TUJ+I+=)U|kY%ZF}B zKli$_@tDe2vESi*Rn+}IeGHE+T!F`}OT^=IX5$IjAvj=x83!f|;h@MtJaLLymh^L< zu?+_s263==KoNCwdm9d^_uxsjwfKIg3y1FAkHhkNRefBVym1qrl647BUA5OO>f!Mx z@B<6q!qWmi!4cD+#Suft6@5&KGNt1v&kj7jI|@Hovkpf$J}Qg38O2XvOIak2DVU3` z+fCT^e735ONwIm?@yzr&IBwYwI6h($o)zoB5BX|1!TgIlOy zUn6~nxiH)>_}_U=JEQ+}O}p$i_-NXBmt^GgXx{x7XV|5Asrt>-?+X3OcFCk8PA^7h S%(TQ>tkD@Zo5g0an*IaqsOC)o literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Havana b/usr/share/zoneinfo/America/Havana new file mode 100644 index 0000000000000000000000000000000000000000..e06629d36841463326ff3350bc2f94d0417c3cdd GIT binary patch literal 1117 zcmciB?@Lor9LMpqO--himAY(MD@|AFbhCvue_Zg_N;j`;5NU!$Ej6TwU{M$m*yb{^ zRfmF~ph?5I`YrAJSR9`zG9PUo{TTJ(@mE)d5(KfjZsf3ZTITc*bIdXP$RR zwC>M7iSz#cdidQ$5@G;7Ch6?vKcw0^J`it%Rdt2loGjEbx-I3;Ta3 z2jOK;E4(tsVA&g%_-|mWcOgJgcqS#P(mesI&MpY#xRx&>HQt;mQ4@sM@S1e1Ku**R zz=@Gd5?ReWu=+>4Ku(%(gOfjYN#wOsExc~L6<$AbA5Q7)6KH=!!?yr+qsu2zHyQnK zYV}<>t?4S9o)deX#&QDQoY0K@3~e=>u~-goS<=JWx5os=$JUS<&KxR(w_S9Iw7$JZ z2kRQm@QyP|cxOce&S%-b!r56x@Gip?oRfAP&ebePjE~$EFYebzX0g8eb2q$aZWP}8 z;xwG+y94Lnv%!Ym3vj{Z0=UrK2pdn;qNXDyXi-f*x=%PN((}xjAJF}#;aHb_Xt6f- z-ijB40XlbJ=@EKx>M3do-9$@lua1`<$@gYC@|jWACNv=MA_fTZ3~o zp9axGs%WfFMC>09hv3@&4z$i6!Mg2QH)?-rN9*15sCfIgs8A{Y(}({*ry1i{iN(qC u8%dEU%j3f=xz6TfRz52#`E)p$nqSNudA1^h$xv8Om}fH@4MzUWsQw4Ss79v% literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Hermosillo b/usr/share/zoneinfo/America/Hermosillo new file mode 100644 index 0000000000000000000000000000000000000000..5c92e2967e7cc5a0e3567ed0321f15b8b3a6b6f8 GIT binary patch literal 286 zcmWHE%1kq2AP5+NDnJ+nLI`W&2P$I)Vv+wquyost0ua6aQ{Dp*y)7*)0Yq- z&bkfepYHev=3i3&0_I;zTJRM$DU?j{*yR)F#oBh1epKK z-G%|A@41i(SpN%kIWYglCowSp70_iM`BxWzfcdYVJp%LJY`g{Lzdd#Y%zrm=519Xc z{euRO`hPoQ!2JKq|33iwje%kMzYidavHjr#5Y1Hn0L*7D_?H0Uvn2d20MV=g4-!B$ zo5OuDpWWaPn9trT3FdPOY=Y2hr+fgZ- z&bkfepYHev=3i3&0_I;zI8DFGIL=5E6P;y)KM0n5Komjm-(d=dlm zU$HZQ`L8bi0P|lzdj#gc*?0@ge|zi*nE!6#9x(s?`Uedl^FGW!TmYg!_8$WCKh-Y< z^FQY=0rS7aw}bg#{oBC&Z}ypB{&)QhF#i`v`UjByUq8|rK=khyo?!l;8=heP-xJzk z{=XgCVE+FVydOZ}$uNT#Ofj~<2lJWA--G$gg**iy21_D$1Bhk~cn9XQIlKk)*$pm$ z`Ru*wU_Ph7CNQ6K?P8E}2CffNz- z&bkfepYHev=3i3&0_I;zI8DFGIL=5E6P;y)KM0n5Komjm-(d=dlm zUjc0f$-lbz1I&N@>=Bs%X5%d||Lw6OVE(&_d%*nn>mM|L)PI^}tNf2v;! z=6}v#0_J~-ZwK?g`nQ4kzh8KQ_5Zoy$pF&#_k=c>|8IvjnE!wI{|CS@U|^X3?*oWp zY=8IwM7!vh6@X}0mp};pc{>9WBM>sPfGH3Y0a<};HdZ!PpveFK>sEriwsQj`%m4qY z7cg*u**suU07No~{QrOa0HcJDZwQ043lIkbaX1hMgfO@Q*{(n_E})- z&bkfepYHev=3i3&0_I;z- z&bkfepYHev=3i3&0_I;z z_Sg|H|K0wF1t4|r*FR_g(H{!uf#pB;9|H3~)h`9hf6iY5=6{KA2lK!Bw}JWpcF2I$ z|6l(90WfSB7^eUG0HPS%A3gxlF8XB!AllU>5JG?64&pMn>*ju7Vgy2F7BB^3qC-|T zAOs4s{{O%BBgi{DH!!mN|G#- z&bkfepYHev=3i3&0_I;zBA74OIRVTUs!Rn5GYDsNNp7VhDmcMU;`Bul?f%(?AcZ2yh8zAv&yL&E}Z`TirSNqxZV7@~> zBwig`W;cKYoctm2>YP#w=DX-mng9}ab%_V_T|XZcU}8jpEX-s=khu&D|NqaOz{v9d ze}4l52Z+tU^Z)Bk;*(-Qd5Txk+N7PC8y{8-#iKZhi9Jm_ssJ$N>il8#}15% zHhA$U2VbeCH49a`L0P#o+QIwB>^~a1x~tPSW>)`dyvNq-D(`V+Utx><61HY8!SRkU zSYS_KA=(4m^lsR`{zPY#gvBs?c)klh@~kt;=Z>KkIPuXf_-I=td@ND{CtY{L$yFkJ zyu=Ql5N)tCOH>&p#kvWn#@OK0Z9(Jnv~Qbm`sy$E8xBYLp6}icoL^A|7hK(d{jMCi(6;~=SrXvlv`;#t6#v-cjg{;! zV}Ab4D*A=bBRZd7oZixSzx1L*=lycu2e@?jCR}!R4leI{pz`lm>IUIJ^9?wd*9wP% z0XXz~GHN!(9QwZ}Hg5kt`XR+I-Y%NVhA}_GtT@~8b{NLgW0u6{CTFfJvrxUlLJd?w es%r`h&^bV7frfq>dTR3}pCo%~y7fthJwzF=o6m@ic60p<&5 zx`X*5ky>EBsHY~FFJ{RD=8J1`gZUClnh6X*Aj$C-%$H)~PGDqW#sdHU-@(Md047=f i|KGWRf#d)G;|Cade0)O~yn)y?7>Hd$7`T88Q!W64fkAEn literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Juneau b/usr/share/zoneinfo/America/Juneau new file mode 100644 index 0000000000000000000000000000000000000000..e347b369f780629179a5ffd7a256054d901a1ad5 GIT binary patch literal 966 zcmb8tT}V@57zglobME7~>XftATy^}~++4@AV^i0cO=nUzT5J?{CrM!!wGyI`LMtet z@<=y{6vw-Q(oq*BL52{5R*+sqM4va6bP;{s3_ZQizuQ2156}C5f6x0I&do{h?>wlo zMVE+{z{6E3A}s;UkwxUFDOr6P@hmv_jz>6nX;c5WV=tKTzJqTQ5rXcB7KKl z3rG~Ei%!^lvH;FIR;f|n((czO^Y;j_HRgbA%2(KSxe0cN&tb=%afy#J;ae6ict47J z=c{KT^_M&zfR~Pq!pm-rNYobx2jJy>8oc6E7hKqR9Co!GKo;#tBUeW2aK9>03%g5G z8slrV!wq}P5!h4Z!kp)OW0vlVKUV0J-kEZE&4dkJd)ErD8~y@IC!z|?mGn--rF)Cv zvcsPx>X%36;fkG8u&?MH><`|C{R_D)%>{%jaNzA5I5?Mqs~(NRq1j71A7krp48!uh zBXISZbFgwX35O5q3eBlqDqPcY7T%C@!4ZE4T&wulTMdT*h`_^SU@2}g6k;Ej_4 zyy^8zcyrd5rMWE+$Kb7+9c~yJg0~%=gJb9K>wJtg?tTh4bqvDs>Jhj(-VHbZ_@J1~ zc@}g2KOgJguFYZpzlX8eZpI9wH%EJa53?A?b(rPY|Oxy`($W$9Q}meeFFkQt?{FAYV*FJ@$#AEH7* zGFTdFNyM@Uvcjyy!k|*2Oij;LS(%qZMbX8b-uG{b-=z2Op6B^J@BgqHGwd}LXvv~W zL=$YYWmx=?5*icJ9VXC~=j>=?)zYf0VD-Z7A7)k?t9;<5hGDq5_&Z_qmOwwa*Lyq8 zdk6LKlamg(Kk6&opYOr5{6NV|yv{(g2j)YLo5&4!72|wlv>txlb_VC8on`P?O%cpl z_Q5uj0k)T?!Edq>;J0}Z@H>SR9@nQ5_PXyAWjw1NJ?Cuj4CZ+7_8xE-E+ z(G5@abi>p4Y-X05v2qox^0K-2_j@n}x!K3z9Gg3Cg~7rlfur9kA@vTP6;ZW~W7X*h z2RoY`MrIe|teI8U9L~t9TlyF*RzHBnr-ES*-|KVrY8}sV621!Op4tEgYF^hocTzIYQUU_-=UBmb38c zfL2%@T@1?|56vv6kmSOO(H1y*A`y=1tcH~X1|yA;H5L=Bx{(0KmT!gCwNhA9Sje-S zw&*7ur_X}d?i_*RFI;l4O`$;>$I8W((Y8i z>rX$2H=N%OryrjCT{l)9HPRT_w4)B^83*#=%-B*`mze?UzFg*=M1L=5m-+VJXui6- zEx1Gr`i1lV=mo*r!2T*7*F-LYaHWyBqxZtym)(iKAUx_4Nw;MiNJb{zyXf9ccaDMR bXs@F)32owOqs)#|X;o@vwnn4UsML}_4kxPc1&!$JkF@bNJr9S<$8N2XrkuLwNmA~=|0_;8eX1DFTp5R7o>Ab@s-N&^ z%qUae%$sIL`OkAVtlV?M>YzoY?_rlLNW$qUSkpZPYY&^_ROn(wNy-H+U*W>0FRKz1#)QIok!#J=O}( z>uiNf+k^K2F1q+;4c{llSnV+wb7T znaA*wLqBg>fl3}ie-T@c=_gjxVr2v?5yd5ok}iA8!ppc*!5uuu9=iz z_oIujXRISmeJfJkus9TkYmc|X-o9$scOXG+%zwlH*KOJfuiQ2X2b_)YD*r3EUhjZ| z6`y4)f}a$)VfqE!_%w&SdOS5j2WxKS?{)2iB)sl?{$AH#?SPvO(pXfFH1wH5PCjbBd literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/La_Paz b/usr/share/zoneinfo/America/La_Paz new file mode 100644 index 0000000000000000000000000000000000000000..68ddaae768e665a8170ea1485aae51c686f5cfed GIT binary patch literal 170 zcmWHE%1kq2AP5+NDnJ+nLI`VN1}b9#VuAlakl8Ms0-|@wO?v{S-(9`J$i)2r{{a~W q1~AF;|Nl81Mvnjgj~`&*@$n5|a0X(h;1C8~0}}==8z5eoL>jbKmMQp0MHBuIf)|yV7fon0YuCH{C)vMD-=vP0HRgrJqGjD zL~Fo&T~%hVdfnM`92l9IP~iXn+mA3X0Le8V^7sKpmjC~EZeZZ>@eN_nH825UQwA;@ JAZcgH1pxMtQp*4U literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/US/Pacific b/usr/share/zoneinfo/America/Los_Angeles similarity index 100% rename from usr/share/zoneinfo/US/Pacific rename to usr/share/zoneinfo/America/Los_Angeles diff --git a/usr/share/zoneinfo/America/Maceio b/usr/share/zoneinfo/America/Maceio new file mode 100644 index 0000000000000000000000000000000000000000..dbb8d57d91d6640c1282fab3a063567d1f663f88 GIT binary patch literal 502 zcmWHE%1kq2AP5+NDnJ+nLI`Wo1S(?&VxIp%Fl|*v4T#>s@A&{s|8-aZqIZ5YF#yrK z?v*Hj=vx-+!2DaUe}U;ck`Fh4#P95k1k2z3EeaODH~Su#fB)_*F#kb_F_`~l`hT$c zudH!k{HqU9HuZUE5=#^)D+XvM}%u)GrY2{2zdLI5nU{HQB<+m30J!?WRR910 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Managua b/usr/share/zoneinfo/America/Managua new file mode 100644 index 0000000000000000000000000000000000000000..86ef76bf2241b6abde0f4790d23b180db4b4b1cc GIT binary patch literal 295 zcmWHE%1kq2AP5+NDnJ+nLI`US04iezVv+wqklC)20;2codb|MXXLBw|0MVRF>;gcv zVBn7jVERfvm@jO23(ObZ5(wsNCQeiU$!i_-2J^L@?}FuxPQC~8ogxl^`Ofy4V7^O8 zUIS1$gR6XG0wWVM6AKVBL+Stj*UK<407(f3mjC}(FJR#K|9|HO1|AT}DB$B8!r%+U U&cPuJu0ZVU62ia*J=vx+h!2DZpIKcEB$@d39;&*nYgXQo3RtAgToBamNzkhcHnExQe5zPNGgBPs+ zD{Bsz|Ls5#SpGYo&IXV%Rx)+s`fl^BwXJfccIsy#+vR3{L)wz;d_l?>l01{Z{Ny-&21X`EW*}w(lH|bu z|L52+F#P{NcLD>;|NpBOFmQlKMxOuw`x_Vpe0)O~e1k(6oPpTaC4?aWNOJ)N%((yu C7@)rZ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Menominee b/usr/share/zoneinfo/America/Menominee new file mode 100644 index 0000000000000000000000000000000000000000..28d2c56e1a991556b5aca45108e3415f3ebfe868 GIT binary patch literal 917 zcmbu-%TE(g6bA5HKxiw{iXf#RA{ClK9oiyLP@zH_LqnsKisBA265KF}Ji^8d2{F1r z6OaX(0F}hVAdyFmqEX9+1-h`*4dLm=7~G8FhDSQy^Z5s`@ZOyJo!^}^$t)&tt@WmZ z?YmTbf{IpP|5yBcES{G^;j5{urkQg1nN^}3dAluAj^0gzgO8WtPxqqmqUjI3*rbtZ zF4D2ZD8IUX!rMA8=62LAaP&<9eHM#%t&5ZiwlDv(&n%HO`e|4*F-Bxs`4N0@V?ZJ& zE=|gmhe90^WzuXvtb5*1Wcs0Y`0)L9IJvt4KGNC%r!+d@)EXyzw9E*nS&XnDr&OdS zUA+ezW71*cZ-Yb^8Q*r{%DGIhnv=y5 zIM+J@=cT@a&G|jBIU1Je!lG@4Eo(Dy{-y^m_%H}tBiBWmJ2l(|3o~xG@J=Ia8_0w0 zEuA#R9JkeQ(S@t^_5?TWgkVGP5;jIwLhOv1JNIDIXb?76MBo;)18&Xs z!(vGlEPgEz4~rrXwmgi%Z7-j2`RoD=78 zmoWpDtUGYG>I3d6pM!hp7Ix)rhu9gpo}+MIVitB^ZovI_9(ds3n6J^`sR8yZt;0i` z#jrOp3H#>tao!ADBzVN5iVG=1>c5^WA0~;|ze@^PK0l#!{tH=Fn?$BAiCS2i%n~UX GG|FFBrF|3t literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Metlakatla b/usr/share/zoneinfo/America/Metlakatla new file mode 100644 index 0000000000000000000000000000000000000000..71b0eab085dbbb48050d7b6a271ebb1a29fb1926 GIT binary patch literal 586 zcmWHE%1kq2AP5+NDnJ+nLI`Wo1}ftKV!8i7V1MZEMG#%vZXgAsPj^Z!0MVC}zZ8J! zL^S~r{cnf60*L;I*<_lF8gZaXlMPR;2WGI*~>KOv&i&>h3`Qn;pV7`P>@B{`RkmQsA z^QD+f!Td1OM+-pWVNX2_Ky-xMe+4joR13_H{Pz&dk6OwD=11Q<4CcqUxGi90VrF4t z#S7WkL6C`!f#I4O1H=FSEz3Y;e**){|NnC*FmixN9xw?E{>B0Z5s)mSq>pb1LqISP qhXZi{5W9phIC=vG9KC@oE)dfa#MJRM)-%#G(D5}i)HBpG-~s@c41tya literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Mexico_City b/usr/share/zoneinfo/America/Mexico_City new file mode 100644 index 0000000000000000000000000000000000000000..80a415c70ca3d94aa25bbc1e90f3ed169943a704 GIT binary patch literal 773 zcmWHE%1kq2AP5+NDnJ+nLI`Vd0V-nyVu}Aiuyost0ua6aQ{Dp*y)7*)0Yq!F&Gtd6o6=B_XrThU=s8S%r{lH0`tv`&Vc#m>@r}!h4hOLAcn=We_+1l?^9sD z)mN4Vkbw2JLtwtm`afX4?e0D>->&~2m~TJ30L*vDKLF-Cw)7SNwJ|vPF9P$OQ}V%l z7yTA6-_<1$%y;8Y1M}TgjKO^OAI%IP;K?Ei=6l{q1@pZge+ToucesQ3K4*nLfEd0r zG{JnoHDAGe{|as}KcMG2m>-y^-T)E^%Gn9#2Rm|t`5`{D!TeB#*I<5_PA!-p&TtmY zj}VPgMf*6Ecgy z{KPuD4|9H;Psk%^I+k%)21uW9Uh)ADtx)>p0*F>@EO!9W zN}wVD`I`4S!F;V((qO*! zzHBgG=dy(ZP#J^nJYO(hZ?hDbuV1GR<{M1<1Lhm1dtU&lGb*|V<{P`~g83#v2f%z& zb$&44%xDpqZ_f4+%(sxV7`lf6qxVoq7LS}e(t%z$iz%6{Qv)S z1OvnW|Hlt7u>Ajj^#TLO|NoC4F!K2LhA=n=hcM_G7z42p1D6euWoHZ|jqG%MjrEN5 O40L=A4fPE547dR2=xD(J literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Moncton b/usr/share/zoneinfo/America/Moncton new file mode 100644 index 0000000000000000000000000000000000000000..020e33d976179e8f61a6040caaef3c8eb7f348bc GIT binary patch literal 1493 zcmb`_YcNz{7zgmPxr{cq+;Yn$l}oI9mI%d2*=Z*$X@<^+E<7Z+HQJ%tr*5oKv@TdJd0tHF>hv5X@N3k=sz+1|>8cSZHUb_r!NQs3=e z1MfL{8{TVN2-`cIgYDN}(Oetl$Pa@Z z*e!1scE1pyB7Gj0WUyzLHSBfbIqYrEgZF#n!#%Rx)+s`fl^BwXJfccIsy#+vR3{L)wz?qI&pS>X>LhVKkbFyC*@ zS1{kdf*Z^a=(!H&2PUdFfCPeac7plAj+|hAh|g>=KUCp0m>;H73+9J2oCWhEL}wKM zwJ}6ISP$k$eysuXqYg|2^P{iEf%!2j*MXEV#BOx}^W!=vfcf!LmB9Rj%px#9vCi%T zh>_$O0_G>jDSTjLA`|}qzwiqK!~g%Q7cj8=|G#qsBZrS~2!nGl5W9phZ~+-+TmbPr Bc~t-a literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Montevideo b/usr/share/zoneinfo/America/Montevideo new file mode 100644 index 0000000000000000000000000000000000000000..4b2fb3e560f6ad26b30b2215d26b3d6176d076b2 GIT binary patch literal 969 zcma*jTS(JU90&0KYIB!da}FY!Z8NiJLzHNNX4eT7w`JT`D{m!2;pTD!+A}l*Z zyn_}E-||oP@-{hNn;0LxRUfRB!xutP$`Lker@Z<_6`{QL_CPh|^=A!c${X?CG0L0K z6R6+*J__F%ABFEeAAs+L2jKBr-Eb_}4d3r;gC7Li;P|PoYWm*8+U@Y8Lw-1+*TWNQ zy>L=yGgDt`y$()gb@1bJVR%xPfG01umr>vRsvf+b|GE`kXmr2}J<|rNFKLd#OFy*m zuRk?-|9eqgM*pMGf830m@fs+_`_4v?iETra(ta&0ee>!PS(XUno!sAwck#8w>hSFLiXl zr5PLQ#$pxvjp_ZUmn%%Dmq&8Hd-L2B>ZbEWsMom`;rg9hVgerx%~#TtJ2Zna%0|7@ zgZy?HZjyDN-ZXU>ZqByAEzx?|ku<^1!GK-h!!@FW-6!kd*3f5o*TE9lb0ptGeYCWU;) zUZh2Zvh9PnGOY>^dNI%O^Qrnx-1bQ8$-ep zZ;2brknWBIX-F_lXm%qp7gHCMc)ek}5b++%c09lDA7JsEJkR&{dCvD7c}K@?51VnR zc!M@AdFD@KUK9AXDSS1KOg*LSIoXn>9PJN}QD!T?Cy+5IK=~)THAOjnuS=p-uF3)a z55_J=B?{H4`T(W+pbyUL+L9q_Vy$D8`K@&sN^Q^!>)ge#?#w>eVEhdmZj4LR6TZBJ zXT8heeL?P5fbM5!((s(&96a~h3-pZxX?R}$eR%$%%Wz@GCD_z<1TNap3m5xi@B&9W zTvFbXVSFt#gkZCJCv2`U8R_2qHI$+({ZN&pv}7ycMI$Auo81y^l+4BLv{!uIOxuzh+mMLmab7IwUO4OdSj;F<>yVdt~cNnT^i zt_;Dh+nsQ2?{QeXAi?fENs)S(r;GNvf;&vfpRm_|{$+f{m;1-LO{HYrM9f|V%BxuYrz x=CVx@nQe~py`67KW+6U@!ZK^)8Eoc5u$fN+oqn=2;&pjkqBG)lyWB2O_zN7H-5me` literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Noronha b/usr/share/zoneinfo/America/Noronha new file mode 100644 index 0000000000000000000000000000000000000000..9e74745ca79137918281337fa270c5fec4bd7da1 GIT binary patch literal 484 zcmWHE%1kq2AP5+NDnJ+nLI`V72P$I*VxIp%Fl|+83W(mpZ+!tw|23KbqIZ5&QvlJs z?xhKU=vx*G!2DaU-+<{ml9v~N#P96%2Fu_5%?=j7H~RvZfB$X|nExO|70mxK{UccY zSJnV9|J#8uu>5yEfe9dUegw*a`9F?t2h0EBIs#VzYsD+D{O{L4!18~(^Cy7(DSNU( z0YuAHoCNdb7pN})@fC~@g87P#(F!2G68A1JUpazl0f?{sC`kZBtC~Mq0H&|(1oO?m z?Ev#Fc9etpmiMnJfaEP-GJ^G6pZExtx5;Oiz{E%t{Qv*q90rE}|37|UWcmO9@dE}9 VAKwrLT?0cPHe%qi0g`q`TmX|XySo4Y literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/North_Dakota/Beulah b/usr/share/zoneinfo/America/North_Dakota/Beulah new file mode 100644 index 0000000000000000000000000000000000000000..becf4383301e2d90db0c0c06659b588d25042ee5 GIT binary patch literal 1043 zcmb``?MqWp90%~TIi0&*>sD%Wn>}c`w&vWXGq;{r+gdY6VmGV^OEAUWWJN{L!!51Y zi|A4WmT6nj6H-llQw&OpBIx18gvbJWcvIN}Q9;sl>zwaD;G2GzbHC?v?(fHab;QlB z%?>hYDQE{)3iAAg6Jyotk0W1P%3%i`Ve^3z}862f!AKViuszCTO_4| zJ{c+m+y3V#lis3pgx-SQh(eW4cgrLjdme9kD|#a&wERIGi_>@Dd6Q|Jn?F3~uNj*^+66BdPQwfDr*PkLy$fE{ za~@uN<_Nr`traegH^3!3cfd=7Zg`n{Eo?21Dzs5*5@DO(1>1f&leBODVuBqRBV0E2 z9bP_^g;%8C!Yez<@P5^~0l55t3RfH-XVg{)KErEvJ%XJjFJMz-XzXyJKxI6=9-uT!Cv9!KD+vvJsa#R>b4bMpEAPL4bAX|eOWl*3c)r0 zad@Mk)wR|>HBAS#U$wdhbFbmh%Sqhd^zi|_c|fb{mXS;F*2`L5x7|#@b?sVR>$`gs z^l{`~;Xz$7t(kRqOlGkNAN%=e;-gV!VeT-u$fp_(Ppn$k;sZ*}P z3+X^Ny`XIcVMI0QqGV7?5J7dbZnD5$ZYp~rDoC1c{hsgs05AIec+T^Dp7VR)z&R(p zx4YBLW?dS7f`V3f_K`MzOyFV3^0iMVB`6Qx@TruqCIy9Z?5qWjU;Yd~>yzMA#qS8+ zPqiBv<-b!$43yKK_Q2DxTH%?eJ~;Eh3ulKc^mvS2G#e;s&SfYu?Xej+@1RK`>)K0I z%K6RH3gv=^G%PqLV4>dw>kXr@{`N5D#UIz;Iq%}QFO5Iq(~Qj>?SoZP z)C(`@I}I;9z8_xH-2oT1HNnMOH^U`f8@$-I3O1Gp6>5~~McAaZ!ls{kt!5-@t zxYqp|UMtw)I`bbs#aP`(3HGMPVc(PQ@VYliczr@tso0PlfH$813fEsb2{-iQ-fLsD zKSGU7J96*U-_ZjHs-g<@gMpoJ@Yj8&)$pCCL!$D(cR_w`^WWebBC45jdnn980Uo<}wDM>UGe5VVTjZBo4o9e3cFRsj$mNnRx1{66~wyy|!O{a)t{zu%W{y4l52 zhc20PgKV<+!=E%t*W#p|AWCaw;0Ad{C31Z=#1rgaftaNI1(Op$!xZ^q%$+wdHTn{s zTpfp}-amxu=@}JyubB+Nw9zqmIv~LGzPs>@zXxWtbihm(54Dy`c$O}NI*lHlOGt%! zgzfW{N0MRAhodkz{0GucH=!Z8291OBFt2wSGQJnk5C-~I78x^XWH z-Slb~-5gP(TgHz;Pk0Mn@85ym;1X>0Mqt~Wp8}cJUiKQ@;aNcY(udKV){r1O@?So= zTojiFC`uF~D^#2)M!(A9$w|e#IG!>vthCLP(juKUvvitlG{+hXj7*-vL~|wvzl`z# D+K#Hs literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Ojinaga b/usr/share/zoneinfo/America/Ojinaga new file mode 100644 index 0000000000000000000000000000000000000000..f7e40c08185080d9594d56add6a5c7c5874d0332 GIT binary patch literal 718 zcmWHE%1kq2AP5+NDnJ+nLI`WI1uA0&Vv+wquyost0ua6aQ{Dp*y)7*)0YqK+0hzM0Xj1`ut|t_9{>NPh=$ z87!XjfccicZ-V(&Uxg-s7}nb^g84QZxWIhd-E+ZwyZ$#|zWwZaFyA5n9GLIeGP?mJ z;N-sn%y&+y1@m3>CxQ8{F7aT#8-EFy@2=tq=DYuxC;-&P;K`y4=6l{K2J^k1u!8yC zbC!bD`&^3w^L=aD!F<1Mc3{4LOeUBgFiio>547LUm=7&Ai5nup<2)V}~iXq}CADAEc?<(}3Cxe(*9qpwrECH7 zpWzNh zCT5oZ|Ic_ZFaSv#1`yi^M4mgr!14e8)e8)KKE5Fg0YI#4U~FsvA{n@BfTW!<7XUfW BELZ>l literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/US/Arizona b/usr/share/zoneinfo/America/Phoenix similarity index 100% rename from usr/share/zoneinfo/US/Arizona rename to usr/share/zoneinfo/America/Phoenix diff --git a/usr/share/zoneinfo/America/Port-au-Prince b/usr/share/zoneinfo/America/Port-au-Prince new file mode 100644 index 0000000000000000000000000000000000000000..3e75731baa7c47f2a60ad07733d6f8467ccfbebf GIT binary patch literal 565 zcmWHE%1kq2AP5+NDnJ+nLI`Wo1uA0!V!{7Fkl8LD0HWvQ75)L~my~w90HUQB-#dWm zkM9CNwDiM^V7|=73t+zN!OdX4+{R5{zWl0V>y_w6nf{dgKEJATTQW1?C&OTZ8!~L3hA>C;tktd!18U9T*R749pLf5d`x?LQjDCA-_L^`C+E3!2F0KA3rcM zGZ7E}|KDT4zyKs&7+C)QKYoCb^Z);y8yI+fd_x!l0)T|83lIl~FmM40Qy@pj*I3U; P&p^l5&`{4%&wvX6G;?mv literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Porto_Velho b/usr/share/zoneinfo/America/Porto_Velho new file mode 100644 index 0000000000000000000000000000000000000000..7f8047d9396f92476873c9dbedb4598d9d238046 GIT binary patch literal 394 zcmWHE%1kq2AP5+NDnJ+nLI`V-1uA0(VxIp%Fl|-S3lP17Kl}rj{_D2^MDP6Q5yEoedy!egs;9`9F?d2Fw5AdH`1cYb6_4{`VUZu>7Cy?hPP+%ATC# z0HWn8o`U)E3!D#t_zK2%!F0wm`-?mfsvVs t@&Err>EOaI6Q=b3&=6y0ss#_Fq;4X literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Punta_Arenas b/usr/share/zoneinfo/America/Punta_Arenas new file mode 100644 index 0000000000000000000000000000000000000000..aa839ea7d42eb9822002e66322c4ae195f1644b5 GIT binary patch literal 1218 zcmcJ~ZAep57zglkx4D^fscELBwJgnA)^wWFbY5SUnr|y-O00+iQ;9T5{g6;esPrLA zln4tkA|yhuT1`pu5|vbo95j}Y1Z74MiAC?~?VLaK*-t%}^E~|S^FLg!bzenUELpNR znqY^Ob?Ga$G^U~_K%!OA95&Bpt3J!jW~c3)h0U&pHxJqDCdWlKg#-0)e|-wiJdj2v z*c>da#{PDA9PZsoypH`{`4Q~xA#UvL)1BB4E!g1UaV_i!J%+sF=zHW}ta=N(48_Q~ z>e}E1XENqu+i!t=S8_ZP=|2!s^GaZYtF?%1%J>{uUK|T6v^v(` z-bj34<5N%U6F=xgLM!R!M|j6$4V-+=0jKoL!luezIJLzI^F>btdX1!&55nn&TX05p z2b}4D9yZ4e@H9ruU#sCPzjiolR;Fj~v*+sIoRKPcm$MYk9U{o*^(Vpkk5t$fSQqK_?B64o$rUoW z$Nznlk~Dgj5Zdn%g(M9N#8Z;SMdHmmN4sl+^JSg*=H**S5k1lRczWXKF%Yk0+D!(p EzhvT4*#H0l literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Rankin_Inlet b/usr/share/zoneinfo/America/Rankin_Inlet new file mode 100644 index 0000000000000000000000000000000000000000..6d1d90dede9888571eb09299dbd0b3e7dcfb1cc9 GIT binary patch literal 807 zcmbWwODtSr6bJBc7-n3`R8hvGgEAQ%*PZbi>e-ozMSB&Pw9kd^zWL@;|wr*KI9!c4ujLf*zIU z?vrvJ)ADCfc^!Ufr!%H~6Rc1VczG&Q4=g!RsOzLnSZ~^ZgA6mUz`U^F`vwQ^55ggT zrhWX3Jy`hwhb|1jVLu0G%?v}G@Wb9tIQ&yR{HU!Sj%akikrfU&D$fW%wiw~)q+FSX z82vSD^oxOw=g|r+Vh^t1xUEY#esvd4@b17*#+PAJR~W@vV)rNlLfwhur5I|&y|T`ROG zTzRHw)QT+pUHg~|Tj2_tSs)5}X^UP0k-_QTnCI1~SRb80Y sXjOG$jOl4+A?cFDoGuS@zVa|Pe*zzJ_`+J1DcVKJT4l3|Hc=A(14>JgdH?_b literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Recife b/usr/share/zoneinfo/America/Recife new file mode 100644 index 0000000000000000000000000000000000000000..305abcb8a2217834e8333a2c486ccd389199a334 GIT binary patch literal 484 zcmWHE%1kq2AP5+NDnJ+nLI`V72P$I*VxIp%Fl|-(4iLSA-}3>O{_C&+MDP4)VgRCd z-78T5(YGwtf%&&y{{qu@Bp+@7iQm~736{V6TNEsQZ}vSf|Nh-sVE%&;V=({A^#5S> zUs>b8{BH+R!1CYuk?S~uN6PQ^1t7(f#v^n*De6Mok8|w zp8<%LtGK=ZM9VKQ-2kE$jL$Cs(Ta_kV0k6(6JWk_gaBAx`B8xaNM6R=a|KImuVEF(4@dHMd|NpOE YVBqla4PnqVFaly@1}+;QX=ls@031EO_y7O^ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Regina b/usr/share/zoneinfo/America/Regina new file mode 100644 index 0000000000000000000000000000000000000000..a3f8217a544ebb0993473bbffaae8e2d723c4ec3 GIT binary patch literal 638 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1uA0$Vu}Ai(Drw-42Yh$WBmjWJ%2ZQ1Bl+5>i+>m zZ!_?C0HU|M8iM&d1hl~XovOlM{>~3PVE%4Cg94Dc-RIwd`Fq|8f%$uPawmYq4;68M z)gMlL4VFI=_zKKFYB3osf6VX&T9aP-`m#?=HKsZ0P`Qr%LMZuW+s98kLtX^{KuXy zVE&UhT`>QtrW%<4%-u@>WX^LTX9f`cLR|;UfAL8b%zypt1DOBj+GQ~R?XgP&OpI6| zGYeK>h+@|N|K~no02;A+0V4~LJ%ND(%;o`;Kr2=+U=Z=~4Po$g0pegF4hQ0Z5C&%; Kn+r&oaRC5Dz-C|o literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Resolute b/usr/share/zoneinfo/America/Resolute new file mode 100644 index 0000000000000000000000000000000000000000..97eb8a9c1fbbf56b8e32a1bea34f68e263e2a9d7 GIT binary patch literal 807 zcmbW#Pb`~Z90%~H+G+PHim|GWV$;;>_4f6z$~Lr(k;u$Sa5F;e;!T*vMcTy0!Iso^ zSR^*PEtae%B8_aT%MKzz#6kQC7g;1*-f>g$dY*3_c5CAI=E?K@{PKNnudlPeS0ph< zMH}p}@x^}fnASA(7!*2N(SV<3qUlP&eWUrW#2jDq2i6Mfu+Fju-!y!KIWh-x@>@9J zU=r4Ehh#!0G4c{l3J2lj&q1~(hWA5o%J>kRI?@KG^|!&dI-GENgA>lEG{LuRCfJx) zA+eCDJBLkinXu`^=x2+p!zgUtID_vj@4?w~yKv6TPuMb?%<3dJFazhc{)6*he3x0c zTeb<`Yy1Egq%XkM!T@Z&*zmK3jq8SO`}1(&u@}Do;~i|@d@iwG(ex{rpZCDUqaCm? zSpYlwhFOh>gF3jRz8x-YIfl!uF1TD=g)6jX*qQZPX2E%M0ar#>VArn$xN7GMT>bUj z&lV4sUc(RH?8A?yB)DcE0@sdBNUT@)-W3bor6!xAjk~r0MKlOhv)mOi+ vqJ%>#jiStcBs!LfzDN*=+v6kdXFlSkhohmKF6>PuyvPgoCWnJ}@B()U;8v1r literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Rio_Branco b/usr/share/zoneinfo/America/Rio_Branco new file mode 100644 index 0000000000000000000000000000000000000000..fb5185ca60283bd56f795e9a956274c0b6e63325 GIT binary patch literal 418 zcmWHE%1kq2AP5+NDnJ+nLI`V-2P$I$VxIp%Fl|-a1Q5N0KaBxQ|BX2SqIZ4_2msN$ z?oDt2(YGv4f%&)Ih=J)ll7BCN#P94Z1H~SZufB)__F#kb_KbZezhBR3H zSJo;p|J#8Eu>5yEs{7CynFoMwXOKO) zDgZ>wReU}GqU9F^UI5Vw#;*^6XvM}>u)GrY6ENQ+p&rZ+s%JUC#E1tnGyVU6pn!ql l|Nr9$7+HV;v4MdD#Aaae@eN_nH825UQwA;@AZcgH1pwW1w6g#J literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Santarem b/usr/share/zoneinfo/America/Santarem new file mode 100644 index 0000000000000000000000000000000000000000..f81d144206ac5bd2029d59beac0bb82801ebe67a GIT binary patch literal 409 zcmWHE%1kq2AP5+NDnJ+nLI`V-11e(yVxIp%Fl|+p2Z-LmAN~PM|MlAdqIZ6Dasbi0 z?ll>J=vx+h!2DZpIKcEB$@d39;&*nYgXQo3RtAgToBamNzkhcHnExQe5zPNGgBPs+ zD{Bsz|Ls5#SpGYo&IXV{w_u1wUu^oxv)nZLRG`0wkg7?ZHPPX8fpsyL2um`9VX52~Hq)eWG^T%m z47RWyge_jr!j_8;@QPsrY&G>2wr>BVpvQ>K&^Rn>7=u?{9)N92dtkd0MuCnI`-EnA zRdFBe;8O!TZodexwr}FuoRjwv*lDgBb}`R`T@1Tn*O_S8ty>MRd9LROE%$S7ut%2$ zUR(JaUe_px9C>;aj%uHUHRYXfbb|rrG9L5v7>OzE zg=3XB;B5)#;W&pgur{cNqhmz-r4o*}Z-(P%#R~R3VXg*F9ISwM7_#A{euDYr?g%*L zfd%r^^m>8NO1spFJUw;--dT4R-sSs^V|j+Y3f5V_g0sSAa6YT+qrmbU=ZA1k<1;vS zz60Jhj@&vZe2TpNfME6PLdKB9Af=e?;dcN z6qp9)TmIhj0Hn`K^I-xbGZQll9I`UA{{O$Pf`I`@CNQx4|9|`dBj^ABJ2x=!{{Meq m2csZJghAZLH-sVB1xUEM0C8{#gRX&zu>pf4ki`WgOt=8q(o)<2 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Sao_Paulo b/usr/share/zoneinfo/America/Sao_Paulo new file mode 100644 index 0000000000000000000000000000000000000000..a16da2c4d5a980cd944d86c34ea8a2f597e39b71 GIT binary patch literal 952 zcmcJ}-%C?r9LMozR#LOHE+Q(_$A-vi+G%I$EHi7^Ty56!U~@(Y)zG>qqNpwcqmn=< z?3Z9S4_$vgW7q3dYIPf`F{QZuX@JWm)GV zJT?TE6y;&R%PaZ(ta7>bTCra-`xg7&z8mP3lWFuFw_WHvhb{D~Gr91t!7lXb z`XBJ_uD@_i*(kiH!-V&)`_7p>zVK_J#-c2c1k=9Plx;p2X|fo+5}pA*(TdpY$+ zM-JRLvH^}{O~aAi1-NM{0Y`5daI?{(%h%Y^);Q0y{kM;0jRhIAtaQq@)UrOjW6Ogf Rjg=~H`KZiZCBLgx`#+zs5jOw; literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Scoresbysund b/usr/share/zoneinfo/America/Scoresbysund new file mode 100644 index 0000000000000000000000000000000000000000..fc1b11cbe876cabb53fc1d42db25b0aabd967fc0 GIT binary patch literal 984 zcmcJ}|4S2b9LMoH=V%OnxH5IMnblm=yv@69n%XwC8 zKg5U&Mi3S)ihc-NzpVN}?F$hkn!m(|$|x8WeIW{yijeC*ul)i3)aUrzi8+RHa-N`^$o!Ff&|U(4p_}LLW{`? zH*1WgC+FUu@_+%NZ%l?M!^-s{2dIjwx)3E-?1mvQ(ARm6okhzYb zEOdItp{wTtY^b~p8y&|AE)K&cV@f9Xn%?xIoBtj~w@mubn_maf?i&&48E=8!GwrZ- z)CAjNX4pQ`%#e9o{93dxYD90fd_;Hn7SVp~6gpsjiw=DI0Jmu#6`Xwvx96|H9hsX@ zn0X+R`Qo`Gx^wI*dS@bm?n<6Uckek1d*Xv|*QPj>gaGWV=!Co3+Je707%cNMWPb3) z3iRHE8g%IHPxQW=9^IE-4#U~6aR2Z;jHG7afk+PapZF}3c?VnXp$Eb<=xEhN^q?n$ zj_K~mbP-*w`5#Y_qI@|-QHqj(M-?l|kMFdOyeS>|GrB|&CCbJ*)Xh_M97pNhYIz;% VoATNtL@*F-n{XgVtt$P3f literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Sitka b/usr/share/zoneinfo/America/Sitka new file mode 100644 index 0000000000000000000000000000000000000000..36681ed78eaf0b46f8d142884cf7ae8903a18907 GIT binary patch literal 956 zcmb8t%TE(g6bA6yQaYWXYL%k3fQ|)PT56fL7N{>Q6p3PEO{)fXBt(M?t&$jx(O5N6 z5+6g{*bvRILKB6FE|i#vVPhg{VqF+xd~Q_Y!uZ+{81MQ10EuUE?zz8vzsYPSyQgn& zgw0zfo}i}6&i_h=$3)&9gIDY1>kC5P%&I=A%rG@7M5B-ok|VL|x@3m4mA(eWG>Z%@cP&ZO@;T=roM z_x9J%9CW_m(IC8Vd<sSp2psJ^4X?>K;h3)%Zi@VYn}yAAOI5kdc(r`4hvPH9;kAz? zc-@;<@Os^=Q*Oh9ad@L@gIkA&;7tdo;l$Z{8jrEI?N8zM-U6I#9ECfQ$Kj5j9~G0i z#9}V}*JHH_|MxIf9AV5b@;+KGpJEonxTczHSnXK(Z=TOFC*7J{*jH~$Wm!7IdpGYi i?_`#Bb0@m^Ceg)r60LD^Fcl3&LP{_d4u`@aMfwXhr^v7X literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/St_Johns b/usr/share/zoneinfo/America/St_Johns new file mode 100644 index 0000000000000000000000000000000000000000..94d790baaccb72298bb577041cf3c8400339a7da GIT binary patch literal 1878 zcmbW%e^AqP7zgl;A7duvm!mrvpsq3BxPM+Q2^!F4fX{}t+DbGN?phBZp!+T zdu^15WS(rw!v`a`QGQds05@pn;cwMr@R9Ay(0^3k1ve(&gY~h8;qO+A!c9KaaMOJg zd~CcJZoaI8zrV1jm%d{#Rlz?rtKpU-+HF)nUXu>De)s|WW2pc>QCtL{RPx}qbUAEH zn1tK;e7Iw&e>UCI8JKEAx^KciO~t~dp$o8Ct9+Zz&3&9k%2Ou{5tLmVN1#ke9r5*fa*QbLvYWv18^^^4IYSbmDBk^ zq1{3`xL0nayqM*!pd5OW4-dy*hc79(u+{%8JQC-GM<(>}Xt1A(=0*q3SSW2{8u+rl z6z5~+t?=*ra^Wjl8GN-w3}35^g8#@2g~wlAfUgVOustKfO84Ff3ARu=_;avhdIolK zY_PL`2)=1I!;>v-@SolF@L#9Q3YwoXm{gRvboKCbtq#8Z{vLRytO|C$riR_QJK)(( z>F}MzH2AKd$U^tr3yg#3xN>;z?q)01=N)`_!MX~*Z{flZjDE1^sMA8fGuG!5Rtok< zy|7osdDy#rLP2$(LWhddH}5>mN$G+8M9nZa`WWmVR15Q1pTfLb@4}Bfq>|eJ<*MvZ_c;x$>nJIOeVLi{#jK zpTVoL3dhO(@SSkn>Qp%H!F~gi61Wuc&a8X~z8X@L0 z1`FWKB|&gz>qa=ZvX%Q literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Swift_Current b/usr/share/zoneinfo/America/Swift_Current new file mode 100644 index 0000000000000000000000000000000000000000..bdbb494487de8aeb624c950e470ebba223d16961 GIT binary patch literal 368 zcmWHE%1kq2AP5+NDnJ+nLI`US2P$I&Vu}Ai(Drv4n4Y&|{R9wy{%-aL5PiCn2h6{u z{G|ZIzmzD!0HQCKF$#d_E5Z3-{?*XOVE#3QJ7E5G)1zSi4TgPS{!P*4VE)Yq3&8vr z>N;TlOL2ZM|MjyEVE&tHm%;qE$1Z{S?N={&6WMXCk z5~z^%|NmJp7=W5qFJNT(|9|cT1`aTr2TTGDUA=%o#K$*;!Pf6Bn2m!SMh8bv6tP|NrmYz{v9d|LO${96r7w49+e<92~;H1tiS4 E0FH_xivR!s literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Thule b/usr/share/zoneinfo/America/Thule new file mode 100644 index 0000000000000000000000000000000000000000..f38dc56bf20d9db68515ea7602c9edb39fabae8d GIT binary patch literal 455 zcmWHE%1kq2AP5+NDnJ+nLI`V70xDw$VxIp%FuS4r4@jT-*Qy5~TH|T#1rV)yHRb_` z);ekr=4`RRwrGJ>70AjS=o!N#-?M|PKI4bgct@*Jm+F+Y4Vf9DaX)T*>b%w6n6UnnIqdk6PEPZK-d7`rezN_U3^F3u6^XI9)5VKVA z9p}=}1LPZR8+y~>arEYbO(N@k^c+Ucw^t)S8SKafx0hq*iNZt3q~5raX&W+?lfROZ z3i)|q3Hc@d1GzXQA-{%aIQGBSe~3j`=FYr;^PYs^{QEJuAUevkb8aXMZ@4PLg+1MH zQP(-Rxa|n6@(6HAeH~nCsD;(#0g=$Pah)30$Q`gIZI7_IcCHjIlS<%CPk+LjS92gw}{b8G;S(U&58C z6L8gJ95%iVimX>XJP4b{j>9#<3$S^x5w@Hh;AxFmyLGV5eIB+4vSEk56|S`=;kq0r z>@3UT=wrm0(7^S-6Y!3yKk&}kXYj5&>IkiohKD2Y?*3o!p6h+^-ZSsueOIC)>oxi( z;r$)gU{_59KHxeHA1t^GyLEopy?m1=ba@mO*fZS=d*_SbriPJ_OfHkJkt?$3<^TWW znan^lq2Is_kti~m{t#Kq?q#{S(sz~K7dQI^;tL3*g>4tzN9k@6h>{MRbYS$^OjeWG M=(AW%7L!@|586{C1^@s6 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Toronto b/usr/share/zoneinfo/America/Toronto new file mode 100644 index 0000000000000000000000000000000000000000..668e70d765dc3fb0eda16fb0f1932af607b53412 GIT binary patch literal 1717 zcmb`{|5Fro9LMnm5$Qky5i`X?O^-vkJ0Sc57Nj6yU05BHTItph4D|y$R){l(eIbcv z8YZEfvcXUkQ0oLegCM>r5lu6x;8#LijK~mh#jk-L?dRDa;5gI!=CiMReD?L(`{~xc zCNn)!y63p*4Y9=7?|o#yUK_8kDP#JqAIcdJSyEG^h}`kRWm)7m`Q|o}rC(LWi`-f4 zsfpZ`T8YcHyn=U!fJ!V)-mwF<`}egMLxO{@znI`upze!~2~U{B75# z_`A>jv7;I)Z%KeUadNt8M8Gjz1N^QlbgB$Ug=n8yRD#hmlKf#?* zTV-*s(^amB>Q}=Eh+P@IbZ^*}C z9d=o-N#P}#*nDsSw&XsItwqytL`H@tdXei#a8yz}Pdf|odk6w!OU?mhfO;c*6{=d6pW6okp(%)B2ZXWtu@_^*UcOR~P&)DozVuHS2 f(ASIlT4|RII->Q>Fk6&4(rgX0MMRh*%vQs{dz=-7 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Vancouver b/usr/share/zoneinfo/America/Vancouver new file mode 100644 index 0000000000000000000000000000000000000000..c998491112ea5e4430b8266498cf7f23e1266bc5 GIT binary patch literal 1330 zcmc)H>oZhw7zgm<&LSsSB-II7i`K6DC5aemGRRVTp){q@OoNo_jhHl(>EcMu)HH1; zy~)(LjA=$AhBv0B)Y$D}(Iyo;i(Jb!r{C}U4|v&g<~h&#JoEki-W>Jeg8X1+%`zhi z+O*VbAE_WQE7C3^sodDoaXK}v?E;+-+oU|5Z>l_Ct@m6JwKmU}rBhex#L@X7-WL9t zH4T5_Oz`J09o)yfh4s?suzsik?qBT{==p(89v(Ebz+dX0@pNzKxC4K!x(N?y&cojd zis0e09Qb?60r*F54E$3b3Xdco;^;l2&KWG7Mp-m$oC$$VHlDCaD}~2KR^jpHd3d6G z2>w;0hbJ3X1bWX@aT`2cZGdMkb@6mRTi6ND9eE7@POF3e#9e{sgDT+#zdD>>bjpX9 zY%AfVh07ehXW5t!uk@XO|GwG_ueK(`;uC+C{$J*f)r8|64`%Z^oS(^uUs-CfI(c5q8k`unZ~3&Kh{#i$>U~zJa5A_FfIV zzKVyPFP6X?3eLbTIa#nYMGd<~MZj+IaM;}|lV?b6v~!0&%)?-hnNWf5Hx0YNo?2IU zbJrrgrFj9~`e*>=N&`3&XSP+e!(Q2ru=lBcmhOGRCgJV-Uc$c8URdU@fn}=`0*Ntl zNjWSxyodcw$KZgDW;jq+#?#ymO)acwISL1ror9IN39#zqEsn&P;1VA=B>5~HnrRJ( z$+F?_U?Uu16A4FpTCwC96FKSuM=g)S(cLR>%)o1SXOp`?VoYq?Q+QYP5*&B`2E4m) z5RR{`=V>k>tpnb3{2H7XB*00Dr{Sbo9cON4ZedAY|LqaQ>$e$36d&+rmZDf)&e-DH o0dIDHs+vhpB%Mk6An9~9BO!<+%fQqSMX*8{n5t4KR0^f!AM7IBd;kCd literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Whitehorse b/usr/share/zoneinfo/America/Whitehorse new file mode 100644 index 0000000000000000000000000000000000000000..40baa9aba2a879f7a38a5a0f67e16e7a2d677a5e GIT binary patch literal 1029 zcmb``+e?#S90%}c%R>%@K_2GX?Df=~rmMBNdFW)5G23*t*VSxxViZb|bXYef6Go5` zj-D^(Lp;cM)!Uz6v+Zzkr)3RT9t~)p2-Dls!d&2i4yw}nZhxZ1q!#0Bix7yCYtv`|i)tJ3@5by2DY1ol>8g|4+ z;I^f9c;9GDqB?WF?Ztc7mB?8Q>`Nu#u6rr?@WM3g4}XBW<0J5qz%%%0)c;K`qiGVK=v2=PUB+H<4AEO&O=VGV7#8^a@&(EwFXD#1ZsnaDgpN+;tbCAZ(O&4yua8tS{ J6|`9t{{Yyp^R)l~ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Winnipeg b/usr/share/zoneinfo/America/Winnipeg new file mode 100644 index 0000000000000000000000000000000000000000..7e646d18e18851bfde743b379e52df4ec5b5a20f GIT binary patch literal 1294 zcmciBZ!FYt0LSs~`O}?4B&X{LQQZ!myYnZ1OJT+`;uO_dnv$NlRLleVwQTVyQY*W4 z(LBi7!mRn%q?p;t8W*|fx+IxDC2aZEUBB<=*K^PM-oC%r_x=6-dGg(rRSorZZ6vxUrEG!rn{qRH z$afj{hqCRkuP?ty=>7NUXVJqM!{`z30rZEER`e)oL>ojkXoIN=Jx2KGvHsKOapQf4 ze(zI5rG{$kDn@^5NvPk#h7xA{ZM6AyZPggkHryjx~yRrC{DUzRX*VUukSZBsYkmY8|SR~Vtd`yI4% z?uJ6r%(?Iw+MBAOgW)Bi!?F7sdTV^#BFR5cN@5z1}`BnQb= Oaz#M0QYlx;6~e!?Qp8jM literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/America/Yakutat b/usr/share/zoneinfo/America/Yakutat new file mode 100644 index 0000000000000000000000000000000000000000..773feba89d36ffab4baf105b8f0ae69584a74014 GIT binary patch literal 946 zcmb8u%TE(g6bA6yQabI3TBQgrh$D}dLLH_9rL8Y4v>L@mNJkCsszieetuZkgqoHb| zB)$?i5)v48n5dcPLWu%~jftp%2VeflxmQ-^SoYA4YLs z@OoNeycRzigqMtr!b@*F#JsC-5MI_h053n0gA2QRV0Y&}xM=HMcttD;7Y7n>Nkv9y zygW`H?6tPS-a5C7&b{AT49e0^)jDO_R295(LV(Nf*x^+}Ut#H3Org2exkmlt(D#?}lB!SdZh zaQ*4CuyU;(4js@Hnp2OeaKn}}aAVpHhy7h}llmKu2%F((S)s&uML*ZTvDshn+Q%Zi zZu%9x-tZYTx8cDEyz#07Ztm}gHyxgVEd3s93Cd zHf#Prmtg;>3e*xk7GY)@&dGtGN9?{?k^jm6ur a@l!G0meykAV5&h@WhIyjh2)T|h<^cFp~tQO literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Anchorage b/usr/share/zoneinfo/Anchorage deleted file mode 120000 index cafb24b4f..000000000 --- a/usr/share/zoneinfo/Anchorage +++ /dev/null @@ -1 +0,0 @@ -US/Alaska \ No newline at end of file diff --git a/usr/share/zoneinfo/Antarctica/Casey b/usr/share/zoneinfo/Antarctica/Casey new file mode 100644 index 0000000000000000000000000000000000000000..84f1c61e5c7c35090fd2e628e307cff72389fb02 GIT binary patch literal 287 zcmWHE%1kq2AP5+NDnJ+nLI`US1S(?&VxIp%@K5ec1CY(&b&E{_M0@w2`T(N+R?blX z(f-b7CxGY(F6#ym9kqmC07OUc6mbC2F}<=4AUbxMs{x3POFjys7~(4y*nsE+pX~u4 zIx(UN%umvp3FaqTq=5M;92*%Jnb06e0|*o}Ft9K%%-X=fp=)5kplx8mplxW#z-0qu J+38wv0RS#AC%FIs literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Davis b/usr/share/zoneinfo/Antarctica/Davis new file mode 100644 index 0000000000000000000000000000000000000000..3ec32224f2982db46a19d1a159f9017286fd1413 GIT binary patch literal 197 zcmWHE%1kq2AP5+NDnJ+nLI`VN2P$I*VxIp%@O+K~1Bm|SeqR7Y|8rjrGKRtHmWTm} z_MZOB0Yv+)Tm|O)JAXgG$iT=1gdkxMNGf1pVPJ3zVBpX-FksL&Fb85&1}+;Q%TCvv F3jndjA(sFE literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Macquarie b/usr/share/zoneinfo/Antarctica/Macquarie new file mode 100644 index 0000000000000000000000000000000000000000..99a8e60edffca85f5caf8eda9d05d85a4978e665 GIT binary patch literal 976 zcmcK1-Ahw(9LMqR*&O1W+7r{%t+aA#dpJjJ&eWOa%m+q6L(=jADsvY>7by}o4p^QW zy(uBdKr6W(_M4Q66TKlI7$<7pRqT$$?RUNLo}H|K}oRx||Ti!E@w zcT(naJCSmJJW=y~nGqBVL%OQxP=BLL=1oFMHrjA53vF2Uz(iME^J6AVO8chyatj*& z%)#WbgT!O{^cALrHeu@PS(w)T1@0Mn3ious zT#h!+5Wyl=l_byyeW7;f-YQIKp&sFg|<(G(T?FuXy=fEcHQ)%#p^+| z)Yb}%ng?*dxUvFW;_gPDuvpPbbv}bW>oBY{G~xR*i7zxawD(&7{Q}(1A=F}UH||9 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Mawson b/usr/share/zoneinfo/Antarctica/Mawson new file mode 100644 index 0000000000000000000000000000000000000000..05e4c6c5867330a5af95cd6816ade311a0cac82d GIT binary patch literal 152 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$VxIp%@JPX^0mx?Xx~1g62$BJVkOT%61_rkP Y1`b^V0|spaGaxo);IaXdcDklq0BGzFF8}}l literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Palmer b/usr/share/zoneinfo/Antarctica/Palmer new file mode 100644 index 0000000000000000000000000000000000000000..32c1941634aec9e7721fcf8e9b323e7d99c7f337 GIT binary patch literal 887 zcmbWvOGs2<6bJA#B3}y!kpCI+ zBmdj)g!NvBBL7WsgS9G8b8hG^&+Q@%r^dEu?9|8!I4xQMr%$-xjCain=R0ns!#l^_ z@UD(EIP+Q-oOLlq@ZRo_5za1Ig>&k^z`1E3;XD^yE<8Ij6br~+W-3}i-bs83zt|}y}(Bp$`t!=Qqd{*$iL#czE36*eB z;v`%gJA-`}CBd#YX5=MbEgH!x9sUL%dX)&5^}L14AI!t<_A$7kI|3_#*Q$I*htEEO zJ@ygUTYU?zOzDGtg%1_EM!ugNaMiY(aMip~@O|}p9aNQ(f|HwoseDq}; z^7@7@jbt6`A4A^YnS+mCxDNX*OA6vx-&CjK*#u1{%X()F452D7ez{$$w7XEIxbAggf5w#&9re3?AC?eYHrq*~Sw literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Rothera b/usr/share/zoneinfo/Antarctica/Rothera new file mode 100644 index 0000000000000000000000000000000000000000..ea49c00b2240fbd608425793b225d6e10a58ddef GIT binary patch literal 132 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;4v>0YCS91`|NpOEU|`WTFksL%FlOMg0g`sc FTmZ^O3BCXT literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Troll b/usr/share/zoneinfo/Antarctica/Troll new file mode 100644 index 0000000000000000000000000000000000000000..2359c44bd00ed44d2cdbf4f0aa0d9cea507814ed GIT binary patch literal 158 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;4v=~$UU#@&5T8ZYz<@y;h`DTlq@4kfG_un* V((yIcGu1QDH`MVpGyt=Vxd40b3zz@^ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Antarctica/Vostok b/usr/share/zoneinfo/Antarctica/Vostok new file mode 100644 index 0000000000000000000000000000000000000000..4ce8f74784e970731f5f44b84f73780087890fa5 GIT binary patch literal 170 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V-n#VxIp%@G_#a0mx?1^|cfL(Ry23K@>x3y{iEu m10xfd10<3P7=ZfR0vI@S4Gb8x4a|Yql!40zNZRR|asdFaJQ3vp literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Almaty b/usr/share/zoneinfo/Asia/Almaty new file mode 100644 index 0000000000000000000000000000000000000000..02f047d70fc811f8cc17f2c08ddc1f328576fb94 GIT binary patch literal 618 zcmWHE%1kq2AP5+NDnJ+nLI`Uy0V-n!VuAlauu8J}4v5~m_`Ly0zo>fc0uU`Gu}J_# zi*syL0MkF8P5{voFP|&`(UP|%!SYgPGQoW5J!J<#;xcQ}!L;n02rwaOUl5sK}tH9HjJHgfB^`MigLlU zv26*MHVN_v)26avVA{;c5JLa80Mi!Iehv&kU~yLp%(wh)0Onim`2*%#-xdP%ZI(%b zY1>_2z_eZKZ!m2?>l&DLNWBZD9h*NLU;u*D2gei`nVGOa7VN?hrNCt1p#swH7Qn#5 oz>rkH$N@|f2@E_Sl99*9H-tgkz!Zqhf!K_J%Ld4^(>3J+0Kt`S8UO$Q literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Amman b/usr/share/zoneinfo/Asia/Amman new file mode 100644 index 0000000000000000000000000000000000000000..a3f9dff57148554c4207d71df64851aee2b28b19 GIT binary patch literal 928 zcmcK3-%C?r9LMozm6>O=HWBnf&E>4+)XmMD<+7H}pIaN-Y3kH@bW_L+gSEhZ5oPoT z%!oil^2dctLA1K*_wJS#g;p13_8@^EN#I4GAnSQP`vbi4JI;CSz3+KAR}+0#`;27I zk+CQE#Yf!xNDF)H5W7?fHZLc>edgy5hi+1Csv_#*9?_U3xVehGkkU_i3!gHum#_at zE56^rK0RI_u{Ajw`G`I?oq|?|X3#maU(vZ^Y3RJjF8cTb>SD)8e&`ok-4jEfaDPA- zG$-G$3BE=b>fYo0N%J-IDfu{BE5A+&8|_*X&Y%AM7W<;bKJ0a`da*B#HlRyJ>d~cx zFVOmjK|F70ox<;B!8)|j8iS@&Sf^R3~e8{?F)sa(4Q&n~}{c%O^; z(Nzo2(3Xh^JU=`HtB1ny!c!-_81O>tz&}dZT(XB?jU@nUi$!R&>S3Lt0@kZlN&jTS zMxj(9Y#JAL&`ldkbaQkCZI5rE9gnx+<>@cb8U6v?3w{@2<0&6Qi|*%?_m#~1Xs_`J z+PganTQdfe{=5g{|SzyO#4eXrHgZ{gPuxq4BB5b72RLbqXohxyBvJ#XV x@Fk=JviNxI!35}VD#Zz9ndOhmA-dv%FP_z%)`uonOT literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Anadyr b/usr/share/zoneinfo/Asia/Anadyr new file mode 100644 index 0000000000000000000000000000000000000000..551884d322bcd2201b4b9898ec765141277e6eee GIT binary patch literal 743 zcmWHE%1kq2AP5+NDnJ+nLI`Vd04ie#Vv+wquu4*P4v5~mxaR;+j6qag+5kk0N%$`S z(c&C_8^H9>iC}SwmlGU7e92o!z~WM8M8SONJxU26ahWy3U|Mz#3z(Mc{tBk$tDk{s zh3xBKS~2jRk{aEt8v$YX?2zr4;X+z{mV=+t?^{W2M}Mg z!T~~GsRoN{9mxUH+FN45w9XPgFs(bq9!%@C7=UU05=Ag=kRk-84P)&R7=Xa2ND@pN z+bV!*lfd6#+EkVaOq&_rh0uSVfN2Yz{tVCux)-U=Z-}4PnqWGy-B1AT|bK PLk2DzpopEWp%E7VnShFz literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Aqtau b/usr/share/zoneinfo/Asia/Aqtau new file mode 100644 index 0000000000000000000000000000000000000000..3a40d1175a7d81d8a307d0e546a1fe9a40888b29 GIT binary patch literal 606 zcmWHE%1kq2AP5+NDnJ+nLI`UCnaBpj0{?+vmE@EMAbRWKzYah#1~G|q1|V9TW1|9? z{`q+Uh?aQyX#;4yNU6JixRFW`X}y-oU|PRq5?G%>N;8-?j9vGD0SJtWI>EHD?F2Aw z5|j<5O=XL~w3(4Fg#H@>rY)qi5*UEM;;tE(Z~5B?%(vPr0p?rZ)&uixmYITS+uZ_S z+OAC;Oxw@;1g0HQe}ZYp7QP3JOw24y=#Z5WBE-mw37Hre^c5I@z`}ung@M5>fPn*; l0umT_KqMoObPHhQ@bL{{&^9muVpAYCW8ks@vg~wCxd8kpZUg`T literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Aqtobe b/usr/share/zoneinfo/Asia/Aqtobe new file mode 100644 index 0000000000000000000000000000000000000000..62c5840a83e29b4fcedba95e438581cec96b3cf6 GIT binary patch literal 615 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1}b9%VuAlauu8Ho14M6K{MP{}#vrQRy#YjvNgPlB z(c&B%A@tAB3qX8{m!H7$lDE~t;!;4yNU6JixR< zjwP5@jL`zqNFW`X}y-oU|PSV1xy>Hl!9r)*aa6r<{1@LgK1;i zCNOOh6bq(JWmCYknUOt&{_6&&Eu>=tK>951YJmBczwN+$tG!%czV&SdFyCgGI+(WI z%><_H+Bm_q{j4Wo+9CBdn09PoxWLH7%)-os4q1W1I3WXr=?t(l92i&_7~BFFIDknZ kfsqG9G5|@p07ecU-w+0E0}~)N1!6M>E*l`rPS=zR0Ohl6^Z)<= literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Ashgabat b/usr/share/zoneinfo/Asia/Ashgabat new file mode 100644 index 0000000000000000000000000000000000000000..8482167269080ead3a6046ae5e64b56d48dac1dd GIT binary patch literal 375 zcmWHE%1kq2AP5+NDnJ+nLI`V-1S(?%VuAlauu8Jm1w?OM{MP{}#vrQRy#YjvNgPlB z(c&EY4Z!rz&kI1b#LG`$dCA-A3Lw7JnQ|~+dQZy*5MO3ZDVUa>lLn^cdcwi9e2oW~ zR>-jg(~2=#U|PvX8cZwO@PKI*?Z04JRr(#6R^z@8rqx-w13>1hfB6HZHJrBL9J4mE`0A5WRH?cK}Ggn8Y~)5G~HJQ2|W< z{Ja1}OT7HF0YppQR#yPgQfJD+eCa(c7eIWOHKkx$c1{|Ymg@-z)ABVQU|J!^5=<+` zXn|=ZA89bHY{LVlRkZ(tX;tZWU|Nm)KA2W#g}6)o%bx&{JsMAbCxB?pip3E6$~~~S z){*mIT6@a@Fs-v>Bbe5mvItD;wM+)n`Xw!3+90JAOdG~7xBxQGsHhrD8{0O4X_KH> zFl{QE0;bK3>>>1DH!y7>odvev;;z{PkbcYGK48ApUI{SY`nDdJZ?nu4Oxx}j0MmAD z;$Yf-)+aFSkopr$JGSsWU}R!uVM2$jY-mEPY;efLz+kX}0SL4V7+4q>+yWRlfGHq> qfd@n~0!g<3Mxcm=1A~B%ZwQ07fiV!902``6pQ1;;9XoZ+Wc_%(pt052mfRZvu}W9GF=if^@8r`Drk!msg2i2Q4}ob{c~-Ev8{aoD?apA)z{tc*1_XxL r5|9y^3qY~1Wx&9}z+mCP$m8Q1!r%nN+6KlzY{I~017z9h8gl^v?<_~*^Jkf1m?@zh5L!aqmRA1cAc`Es*+Gan z8Rg(OE9Kx%N=b@vlJX~hzmMz6_v!b%p7-zhJ(tJbG0>+c{|-k_u*Jsx|0gzjOh8xs z51kF!ay9eeO6+3aC#Y7AnTgV{jwy*gwZac>hbes|$4uF^3Gb6a(`fnO;w{@x-kgMr zwK147*9%kq9+>8{!}Lxw%y6oq(vk!-wIY}$|AN_~XQ&d$yo8SGO$c-DV}@C)&p%-9 z$rCK-x{PQ0`q6!8DBEI5j4iX!q*#E3`oTZHN1$0g6JQVKn^tu3XFs~+$b>GvcAzcm z&9E$}h2=8_Sg{%ht$hiwa!Nzk*lOOa0t2P1P&9RuDwnm1k)C%LT0C?fn@( zfR4LmSiijnouS9Jizgy zB3yiqA7MAr$tWHn`G;F@{+f?L0kr@Gtpqa^q!0jAim6+NH8rs#|uo$^;m;x`5GNC zt&k%NrWIrOz_gP0e=x0V{Q*p?Xg>tgs?wLhv>NweFs;t=-T-92`j-b_TI0!m2M}Mg zq8&nCIRqBhI?eA55FdhJk4_BSQ%N*8)siNc%Z30D;9_DKOviw*i=MwdW6*Z+%+` z%(q!438rm#eF4*Ut-ryv{j6(X+9CBWn09RbbbtW}oLu*V`Oe8#z19jT{J7&RoYEW^VX=*WQJTkE9sG%I8GKs%0X}{8qaQb{gX5oOa6*2E z{X~pI|23I}PX>MPsmL_=ZMOuRzB)qxebE&a-bN(H0~}4MaRHp&Cgv&UKxb)M)Q(yM92Uf<0;8p%8 z_RE9Y@D)BWeC19EzG}V!zWTrfukO7EYsLrRwT)@?YnpDrx>7Z~UKK}Q|J4I;AX8vN zI1g+LgwZ!0UZZdJU4boYTj07mFPIsb2V46uv2Sy4V&C4p0j@XCf*q7P$0fM|)APZoe^$=i}(d8sp*V7~O8vI8J-nKkKPT6RtZn3n7D1k>_0R$y8o zM;lBl#>jwaB_Ccet!(`dOsi^GRN*OCe5>$lwn^9@qG!FkH;vNQZiWLEFF-h|Pi6jDgDrNZRR|aRC5N?`;DB literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Chita b/usr/share/zoneinfo/Asia/Chita new file mode 100644 index 0000000000000000000000000000000000000000..9d49cd35cd5e52c5ff0f2c0cc6bd3f4f6e856915 GIT binary patch literal 750 zcmajXNhpM29LMqJHG>K1y;#RGmN6L17)vu4+h8&?A|^sgS+XUGP?EA9Ce4AA97eX1 zTr3CNP)N#h!ai<|e%S zx3K1KKJ4Vy!XaH}K8o^A($|0dj`Wj^y}*y%I@14f2mb@EpYEswPqWd|J+qBEXiW!$ z=MrFuH57&p@KDyy!LXWF7;bXFh>R;3sXT;o={Ah=T!9MlB~SAeZwD~?eqTl%)7R$o zY8l^S4`!fpa{|UK_QUw8R+unS0~5Q=P}QJ=Nwv*3ny2p4!(^Qirj*HHYH%D(Q@cC; z@`f5|Bv1D=w=ZbzryDwb?*g51{eaF~dWO246PPu64zp+1U{2!(%pE?m(Y(BZX|%q6 z6`e2dMHlF;=t9>jv>~DcZFuT|MWRxtXO+c$!~4DMedM$CRw%{Y=J* zT>f~(e}Ddc)Rhx4)>=o?I)|8;F{_=EFg9poUbJ(PPu>d literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Choibalsan b/usr/share/zoneinfo/Asia/Choibalsan new file mode 100644 index 0000000000000000000000000000000000000000..0a948c2eaca30cde2963c330144215ba52d67c5e GIT binary patch literal 619 zcma*fyGw#$6vy#nX+#QH6m+wzW@TPdD@*OB(NH$og(66iAZ&OCx1t;*s2m)eqQb$b zq|vc4$f2#KXmH5FrG#p(=luSGIuD2M`+?_q{VSUrR{C>f;s!5||L-R@ajimZ-H(|4 zhqoSnSFLdjQ;DQ#O--G%yWAm58%GrE!dC^!~N-b*qHRerkDjb zN6fG#R0|KR%}FH2>NBr%ZEh26H`c&|8Z|tm`h-V|=Lx>&%$`NLuJkGFPDbIe*d9C{ z3BnVh06gjU!c$%k?6G&lUabzE)_90#<|9+$F4P~VxQmK_gnsY9O9hW4E0dT1|CA}j xAqp?^Z-NrZiKHl16742PMHElT)ch?|&H4OfundcJh#eurfQ71DLSsfp)h})}XzBm} literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Colombo b/usr/share/zoneinfo/Asia/Colombo new file mode 100644 index 0000000000000000000000000000000000000000..3eeb1b72b68993e26a2452afe98a6420ac66bafb GIT binary patch literal 247 zcmWHE%1kq2AP5+NDnJ+nLI`W&04ie#Vu}Ai5Vmcm3W#o>yH^H8pN^8z0MTcrYA*oM zmr5HfK;{}QW6%K6MuiLtAlk+Ll?EddGYbNQNXZ@cHq}E%90%}cQ`6?Wjik(&D_xpvI_H{|b6UEVHfwE1@$Qz8nFyA?$kd!~yipX` zi^w#}bXr7YM39Ui%CHC}sGt!{NxINw&KtALp6B}y__E(P=XXBm`#o%fF|MfUxRR_n zJlbFf8*c4K8feXz9$~9=Zg}pTVf$ulqK)nTvff&@Z&}0O0c{IBm@x<2#a4Jo@)jQU zZ+5f(>_rn{+f#fE`CMHb^7+(r@Iu~Qcrl7Ye@Q)s{?e)%_6C1|y;Gy`viBhT`{^${ z|Ht_nUKyx||2l|`z29n^-Oau?=~H3xDxJ0Lg5OeUW7{V?7`dyw__Z?e($G@fo_H-f7R(GR&@hdk790r{r+=Wv9x z2HyNW2aa@jU~yhF9Mv@gOY~>qt(_5WcCk%U4@Xz`!7<7wHg-cQ)uF#VJPVHXi-lts zi(ND(ai1?4+1@c7X<*H{1XdbV zaI$t9RwbQ4f0y_ftQPekPvKv65jrVz6UcYZM8SLBaq!+TvxViUkJ{1K*xQh&T^U8L z?Rbnlz2PVFjOuiFUr8Oj-*6iJ%rratS@J>TI?)PzK&VEpkJrNb1vB#Oz*CciPWG#1 zB?$PYc-h}@Q&ksiR$YfV)8HhbleeK2&R2H8 z`STTUf#@V$@Ug{3=oESkaFN3b7r#k>OL{Zm(veWOtXT?|_sEU(F=8q8hpmkv@G;F- zxT0v*$mji^mk<4!2GGw&;uSplhq6UN*0XC8WXR=+PG@E(j>r_rM4+K(tvp%q4=F%M A`Tzg` literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Dhaka b/usr/share/zoneinfo/Asia/Dhaka new file mode 100644 index 0000000000000000000000000000000000000000..28136808b6d1029676448d8711265d8c55cb4bae GIT binary patch literal 231 zcmWHE%1kq2AP5+NDnJ+nLI`VN2P$I&VwwLyklEI@2SlH`-L?TlpJ6SO0Mk>AR)FZc zD=y6dnd@bJL;ys4+uWGI$i&RV!pZ`)>a|SLOps1a$85aQihB7n& literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Dili b/usr/share/zoneinfo/Asia/Dili new file mode 100644 index 0000000000000000000000000000000000000000..bb7be9f3a47112bffcb2f33f70810819b5c2b726 GIT binary patch literal 170 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V-n#VxIp%FzK1Z5fFWPrqKtGe(qNW1t8k;@Jt3q oCPpR(hSEJCenA5RP+#2y1`Z$J5C&}n3m~>+;IaXdcDj~a0C~b1O#lD@ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Dubai b/usr/share/zoneinfo/Asia/Dubai new file mode 100644 index 0000000000000000000000000000000000000000..58d75bc26eec90272e97696f40483eb56c2b8b45 GIT binary patch literal 133 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;j{iWg@YBo{Kmp?$Ak7vI3@kprAq?6ECJbCQ KK+;avgbM(ceGa|= literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Dushanbe b/usr/share/zoneinfo/Asia/Dushanbe new file mode 100644 index 0000000000000000000000000000000000000000..d83fb076a256817ca0a3ec4e43c7768e6680dc84 GIT binary patch literal 366 zcmWHE%1kq2AP5+NDnJ+nLI`V-04iezVuAlauu8JI0Yq)mroXeXvy1>V0o!CnP9&3p0WcVahWygU|M!g1eliV@dVTIHCA9+ zAx9fbE5^uxX(bFfb$)FmeFHC4qqlL^AUD_=YfO8<+yIIS`vMaM=KPcDklq00pK! AfdBvi literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Famagusta b/usr/share/zoneinfo/Asia/Famagusta new file mode 100644 index 0000000000000000000000000000000000000000..cc44179564afe36db0f1f7aab0a19cbc3e4fa4d0 GIT binary patch literal 940 zcmb``OHUI~7>DswY8SL1MbwH@E?N;@hjbY+a`V$uJW0>St`>?dzp(9{rBz z1qlJR4s^nW7qjq|h>rb5O0mwjv#s(Qc$;Gu&$kz)VViLhw*4M~cPtLW#a}MNJKtV{ zg%=5p@v%=2>C}?@F}O6@2bbMG0++{w@UF8icz4JNJ6iJKJ)#A!5SHP+mJD2JvV<9* z$`x}jwdzL(cFr%su6Li|>SuGXn0^YoC!WBb#9g@N`Zz2_2jJRsGdknrRqkk1xizIz z>)hAi`jV?~gZGw|?l)uy(MDk+MQ&WU0Q>&kfSX?W;pVTW;FgEy(bnfp=>Cy5^uRqk zdNAfd+Y&x2op-3+1pA``e7NEl9Pnr1cGE{V==cT)mw%#1jkD{W`+y!>oJ5b$JVHaC zUZ?1MWh@DIOh14-`}^T=atJ=rGm4&!_o0z}aa0Wj(JosD+ATWQ`$s~1v_Xx|KfO|A z%`yD{k1>a_vU&Oimt^4o3VS)rr8UbBDJlyDBJ`!QYDs2hzHoc#mZ->{dXH2ii%PA8 HRh@YavF)T6 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Gaza b/usr/share/zoneinfo/Asia/Gaza new file mode 100644 index 0000000000000000000000000000000000000000..0d79662716b445f61e5577bdb09e7c91e4a40d28 GIT binary patch literal 2950 zcmdtjdpy-=90%~nbQwx(U1t)hq}+0ehENotBzhrnDwiqc7%L_9ODLC-+#_s6Dn%$= zNT*y99l4}v>)56ebxul++3fdxe*1g=-{Wd`>Zaa)Wb?(pasIG=K2n%)4B1kYk9-sn zhHQ=LWax8k-X+L(e>t4LTCtNy&tHAebfEcK?mGOsgV#dcKQJPpIZ&|&^KXPl;J0am zu(+g*PkYIMMGVb%i7(I(y1Al%AEbc(gK-@CA?FJq(?LfbepC5`9A^$3Ap(*q6HIJrjfgU`gZxo)XvK6T?QiuFHelJq7`VSFd z*S!6QFt5}!hV%Kn4BW3AUJ9$&RG?qrku74!iK_B8^b6f|&@Uop@M5_)=odeJfqAul zA-tqU8ohe^0Opq#%}2lNrZ;+xXen4Ta~-VZS%i7*P<2?xx)#08%gOL^ueChFE?o-& zQqOV;QePz>X|PZhxk4%mX*hd3(rA(;?ll?<6A^Z;6!UQJH_ts`W8rGpTzBXxeSBLT{fu3~w+H;J%H)-8|YmY)ur=+~icnqv>dwi+;0y z4(w#(4?E9l714f+x;xId3<)IEE;AZomyUec_5DTIts)BE+7=JHpIIX!?Alhg1NV6x z-j8$7Bu6CA!xgzbbRKetS)7QlYp1&h?(wqopd{WV=CF_IM26Z|aRKZ*Tue#69i0IC z)hocex?jM%3r1o8T4_Gr?1}mX-kaYG2l&*${D^uuaN{$E9(?Cj1P5tX!@-uZ@b}Yl z;eDEg5<0g}91e#}jfO*nUhsi8yWxYE*TSLA_VA(forJEiydgf#!y#5Q$dQ9t=ouF^ z_^7oE9Bw27A5$vDe8il7IATBvj?}1wBMk=OD5=Q|J%|$2;`yi%?howoS?%bLi~7)? z$k+p)XzAiSbQO-Sc>u@wbipx&;p}aM#B`*?vAMZJlxGx;D8N>&D zhJ`#s4>DfPLx1{;E_}LE9?p~xg){5M;H*@6fRw3#?XN)E>qw#RTa40@GV>+ zEe&5)k(JQ7tH1Wbm1F>}6x74lJCiYgVhv&`NFA=?9nLjKT%YpA2PGRW5U7H~Ip44+l_x==ao5oHPA{1~xKjH8@^eutin15vQ z4*jEyWt>|w;MPr5aGPQq+~$+cxzHTXw=d6u+ea(VcbJ;<>82x?`~7~ba0`C?EDe39 zY%$zv>&$s18-8-@0Q{uKNkTVIRYn@p_x!)d>-aqH=kxtNFE0-4o%edIB;zg#c7nd>vLE*m z2|adfBKw*(#;(A!jq_;MItdAKBn$b_Acdi>@9sl3T=^U4k82hng;A%FjX9afCxSp^ zQ&<~ApKIQek8JUh#rZ3}-8_2!>Vvv1&DXNG;Mc9ZM(V!)5i!mF;scm}BRm1WO&Ej+ z@(cO27av*7(0mvD68)gF6Z-eQa_B!8MxY;ZNP|BrOou<|HDUhKm^tQ$=Sra;?y7@F zhF78gOJ%Js{XTwqEL?>AoZm=O`r~UJO_{8f@QmJ3c&5^Jq})g~@|(zmNcr+VMTA}R z4m>9!LWZ$4)^7JL<~0LUVJ(X)^jbZW;1%xcd4yfsrj^K* zW=oMeN|{LAMKVY|i4dgz?43vhDKp$_Fcv5x>{>Oz!@b|WaDxqnYhk0irts=(i{LeB z%CK>i6l`*0B5dk%61mp32f5DlrkJqHOg)Q7)BNktwlvpIeJ(=2^5)ar&_5TpD3wBQ z`Dg^*m~O;lYhsn#30v~dk9h_Gu% z;V#_gdi*fX-D2#JJXa^=&Vc#IUB(e2!miyeuDHkD+Le;*F*1QYlqWLOp7IM}&*3~u z^4;hJcyEmyyszUWygzFc_NtQP)6Id9U*Ut9-LSVu1Xt05gCGIA41!fHKX&(1Cr$J5} zO+n8%s=y~Lq~Ra~Y50^v0pSImUC`Qf}6IK!Oil`aI;4u=WG)^-?AbNZW%2`-@4j_PdBZ8-0$~OxjXRF z&II&rGI?;Dl>_IIRQTDQBk;2>dokTSR~luI?F{<%i*a!K%~8$+d*P1TyZB#7jQ24? z@;^Vud;EXd6QbBdzr)M4Bqk6duSnQ`5bS;m_S3Cx?1{PgR{F`FSemgfb}z$1U7H@O V*{syi(a_P<)l#!rq4n=p<{umC8mj;R literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Ho_Chi_Minh b/usr/share/zoneinfo/Asia/Ho_Chi_Minh new file mode 100644 index 0000000000000000000000000000000000000000..86e21b0f524426287fb3b21a82369283c4040c0e GIT binary patch literal 236 zcmWHE%1kq2AP5+NDnJ+nLI`W&1S(?%V$uIV(9z@E1)?V|*5(4yXHB0qfar^n=L$gd zC2PA6Ao{A&ZUGSeWZS0+Ao{KT43KpUT(-v<7@3$^n3#c(fg$-DNDxS}Ffb$)FaWJ8 lXkg%FV5pnGAn4;8!Vmx=v<=LG*aC;TbMoi>Qv;@<)_(UM|O=&QF`|UR{ zeP_pCFn#yz4KRIgk(33UG30Oo&oxL^TN_a#FJ%>Sye3C#cI{sqkcu387?{}4?C z^MA4?fcZbaI)nMYo;rc~zwgDb0GadWT-**2{db=unE!8`1DOARp7IJ%yfXAD?Eq1X zb*x}MQyvSL&m8+4%xCd^2IjN6vuJ?Sv6(YlfM|BLXJ9^ivn`m<$#w$F=lpgY%;$Qx z3e4xewi3+eIo1Q_3(mF#^M&$rRxmO#voJDI2pJf%xj+soXkcJrV5pnG$icu+-oeNV dVlxQ&_=Yfec!O{-hzJj1@B%WpfI_+!TmUPfblU&` literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Hovd b/usr/share/zoneinfo/Asia/Hovd new file mode 100644 index 0000000000000000000000000000000000000000..6e08a261274e48f93eb5e221ba294e54ca671b94 GIT binary patch literal 594 zcmWHE%1kq2AP5+NDnJ+nLI`UCnaBdf0{?-a?ed=~AbtGYuNHu4iI>+VfN06v+#rfU z>P$44FTKaE0mPSCV+-cX&QSpK<$C17eEAwCFkc~u5zJSNegftzc|Qj8m939~`6}8+ z!F*Ne6=1#^_i`{_o#iM42&jKKA^@T_o-7AZ44PM#f%#fTI>CJHEgfLK&XQ~}Uw29t zn6KC33+C&W_<;EaDf(c(VQj_(5W~pVy8%QS+j@cdCc3&{zNxGZm~Y0*59V9FJh%a* z&U(wP1t8jH$xblecFG(u->zjgm~UTF2j)AZ)PnhrAqilp{0Sdu7dIpjuifeX1<4tH{e zBqim7T8artIo`MtB_+rAeRfHCzW(p;d*1K;UW>J>Lrecg#7^+xvHbr_89U~~Cit7B zZezHZyATw(!(Cr=N%%cdWwV_dBAa>QhWgHMDD>^X#+5zn+qq#EANU^bG^5M6tq#5) zu_D08c|DApP{ZiKD5&TTgfR^SV})lJS8xmCRW6ty--C(%>rg4aQ4ovrbnvstQw)o*{C2E^JFr*ML3g) zJj9-VJYIiq|32z1CTia0x3ZPJx7f&+XlP0lKxDI%gs&pD4oy*j$!wu2HY!ann>;o; M^3$`mNUihx0nK!Yq5uE@ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Jakarta b/usr/share/zoneinfo/Asia/Jakarta new file mode 100644 index 0000000000000000000000000000000000000000..c9752d2f23ebbb8b1ca5b8ac604c6f24be5d0def GIT binary patch literal 248 zcmWHE%1kq2AP5+NDnJ+nLI`W&04ie#Vuk-eV4voh0HRk`v_1gQyTtB+`KR|ccYyep z!rm2t=<7DeI6(BR|7r{%`pedR9gIxOEX=ITYzz!33PAHfBntyWx&i~xhRg~EJ_d%m x2@E0(3LKOf2 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Jayapura b/usr/share/zoneinfo/Asia/Jayapura new file mode 100644 index 0000000000000000000000000000000000000000..7c22f539d948e5757a0847892da344309b582473 GIT binary patch literal 171 zcmWHE%1kq2AP5+NDnJ+nLI`VN1}b9#Vxj*)uuJUV3=n-GV&?}C{blQ-3`QoPlI9m6 m+6fq{jA f!QO*`!^by-LEFFtgpCatxNN|*ovw+Mu>ltVLVFjF literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Kamchatka b/usr/share/zoneinfo/Asia/Kamchatka new file mode 100644 index 0000000000000000000000000000000000000000..c65155402db6a465c05a8cd71ec7a0fc0f792762 GIT binary patch literal 727 zcmajbODIHP7zW^P#;6HJL%Twx6>Z1*%dcZcvD2n;WcbJc94jT5ibGl*A3aa^Zd0X&`#IGtSEA5t{)p zazO#3#@}Fc|09g)yo9k0Cos;q594(kFhM;J6T>H9lJ@{qDI9miqI#W!$q%zHyr=X@ zZZG;VPjz)c^^OImt<*q`tq7)%XkkWgEY!C6L&2iA5{uXq3Ns61U{>uX%#M`99O2gO z*8|KAd%q)=+?!+cypL=2e5V6lcXfzfutx(18vLr`iRgT=#(R$?hB>p(AU z9z-`Jn$XKio6yTW)6py94d@lmMp)^Q|_xMZz@nzQ7f@#?~dSF_vM;=Ve*9d@V zg&amOtr-0YOe=Xm2Gh#cSHQH2_E9jcD!mO%t8p&})9Ngj1wiJje>noCHJ%(+0P!^| zvLW=9WngiwBh$gO_LdGXt+S*OOzTd`0@Hde(O_D?#0N|pq}YOK!`O@oAoGlhoWZoQ ztrwU!2~q{qrm{L<+RTU@LjUCh(-zVy0w8@BcRqmmmcQA+e5*Z|zRvAKwrLZ37DiZ9@YfZ3(0e8MthKEIVCGE&u>Lg9`uv literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Kolkata b/usr/share/zoneinfo/Asia/Kolkata new file mode 100644 index 0000000000000000000000000000000000000000..00bc80a65e9a7aa470d63fba1ce1b29ef173d922 GIT binary patch literal 220 zcmWHE%1kq2AP5+NDnJ+nLI`VN2P$I)VzK`~ptegw14KJNe{BGw+vo1t1)@*g?g5LR zVJ(yZ@y|>(S^=Ujl?csXWMXCkLI#GQ8z3u#E-C-|Z~>XRrdGxVTmbC&IB@^~ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Krasnoyarsk b/usr/share/zoneinfo/Asia/Krasnoyarsk new file mode 100644 index 0000000000000000000000000000000000000000..e0d4fcb5c3d781943a65dc53cca9fab5d1905f9f GIT binary patch literal 741 zcmajXTPTBJ9LMozHd=<uk1%`m8Rje;K||XKG!Ea}*}U9>4Rl`1 zAv!;57G03HiY|2TM;9q3&_ypZutaEfdfW?3?<$~ay$Y5&x;Qq!d`gSvO%HN`(Cwd} z=>O}#Pu+!tRQs@@d=n87VzCOugfv@-7dr*?v{;F_tehumE{$#--CE+ANzd$ft>-T! C>VmQW literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Kuching b/usr/share/zoneinfo/Asia/Kuching new file mode 100644 index 0000000000000000000000000000000000000000..59bc6e40b7bb0b4eb199dd8c17f416ee00ca4158 GIT binary patch literal 320 zcmWHE%1kq2AP5+NDnJ+nLI`US0xDw#Vu}Aiu(peB0*Ky~?%n~S_gAYofa%ZD0U-Kd z>>4ot;ME0S{$aZZ3?T8t+b&-K(MJ`8!SY9Eu!H4~GrEK2k5^iO*zBf#>PJaRuUGBcq-7G?&9^a7BtGAkHZ7#KU}aNed$|31nF^aM=L)cDfc^0DJ^|K>z>% literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Macau b/usr/share/zoneinfo/Asia/Macau new file mode 100644 index 0000000000000000000000000000000000000000..c22f75e42db6b12db3c837056436cb77d176b83e GIT binary patch literal 791 zcmWHE%1kq2AP5+NDnJ+nLI`Vd2P$I)Vv+wq(3%R8aeg#PW&$+lAAo}kV80sc4@PJ500UzHG2It@q25mzF25kdN24|NL1}>n0t_2qWpKFVf literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Magadan b/usr/share/zoneinfo/Asia/Magadan new file mode 100644 index 0000000000000000000000000000000000000000..16bac8444656c393288dcc0209a96c7c3f487a19 GIT binary patch literal 751 zcmajXO(?^09LMqB--dZONO_opas?UtyoCSdw^v^3xN{X+ajbJv$9s~Y zaxoGnOiN(m=sQeuJi+Al8<=7_g(|}#Ox0|{G=&SMhfP7X^uR~+)$bcH<8gzMWezv` zy`IE<*2xIe>^WfeS_jn5+hESP3FZ#vLS0W16g#a>8l)do!@RN_nBN=%3zQMCP<-+G z^#+R-!9Mz~`0g5A^7)J|Jw8AiZqLxh^($C*v<*!Yd$8O!2P=9PVC9&{N%N}A!|3Yn zS#(WW8`@m$MArry(RHe3blqz!te52by)eLrhiGWoQ9|pv-beFoGv8>t#dA;HqF7{t zB;b#q^zZB6PXh%BV>4YeZF+@C8FPCD8Dp+p7EY(YPq&xJtTsE-h&sOYe2Xm9$WN12 H6hnUiiV=;I literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Makassar b/usr/share/zoneinfo/Asia/Makassar new file mode 100644 index 0000000000000000000000000000000000000000..5990010b649745369501c7641c401bcad4345b85 GIT binary patch literal 190 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V-n!V$uIVu<%pt1Q5MT>?)W(-67im;$I4TSHQ@` z3{;!{0c0+a1hNYn7&sUh>LxJofY|~*z99_0K&)+G0mPOJ;hrIm3|t^m*MbWGa>yuM literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Manila b/usr/share/zoneinfo/Asia/Manila new file mode 100644 index 0000000000000000000000000000000000000000..3c3584e09ae47e9ab4e174fb375345679e06c95b GIT binary patch literal 238 zcmWHE%1kq2AP5+NDnJ+nLI`W&0xDw#VuAlaAoB1In68$$p8(TzUGxTV7}Io^I*RAmUCdf&XSE_zV4I_V7^|| eh!6%YAfamn;_CPs>zV2q=o{1flEe~U*aShKSK|AeDs0@^`d zTI&+Io4LDkFQ<1TSk*Pl43Rh)BviN(1V67wn3Cr!{15YpSR~=6waC)_b{ESL8xAO2 zE`^cPMi@1m1m&GF7+n_#W6HcxVSIU*e^UcflfAyo0-G;F`>;||6@-f}D_3{LvI zJivY8(Kb}?IAM}=5hgE8z?888nA+D4H7yR9RzK!q`?Ng`Fg>>oW>n?FOj$A1X%#-d z6QM!MY1li%jTkxWD+W1x{}tKj;Unj)ieT>E6Euy#z`Ugs$hDrs{Lx1j+gD)OLN+%a zBNr;?kuBymovQ;sKY<-=BCH|d0&w63$Lj^3`tcK;MLmb<0o3Xfg{(gUa{J*b% ukJ2$hD&1_Cy^-(<=^o(;32EvkVs`Sxh8H~pmuVFlfF~oS3zR0WOt%xKc3qm%Mu#l8Ala-`A z7Me0)Iax?7CLuO92pf6c`=70vb36Cf|K9W6#V0oObZW?D32cHlFVXcU1~%r-+V_{$ zhC>$3-8bKbvorEn_AhV)f-D>g^f3FvkE;o8(BmcUWezVMDcIhKEVp*=@Eo#L4;5?W zFmz4_!^RU~c&`FRH2J_t(=UwDy})SI9gLBm!&t8qsFXgd`TNTETNw9nqvtt(WY+1$ zG0qcCccE&};`FDAk5Qt#$5R=Jae5mftr)({>xIu#f7ARpq=9Sv0-j zf7LD7ZGyz@pC!eyRB*i{f`mP6< Ieo~g_AMfvp!vFvP literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Omsk b/usr/share/zoneinfo/Asia/Omsk new file mode 100644 index 0000000000000000000000000000000000000000..dc0ed422f6193fb5d7dcb59dd0eb3e06eec8d4de GIT binary patch literal 741 zcmajdTPVX(90%|-8!eZT!e;KwFyn8Sx&Oy5jSXo@qBOS@B}s?};Z2e#Ng?ti<+cZ{ zOnH(-$;(m-4<1b6MGWVB_ekyg?{_|Z&;OkN)8E$I)1@YUBcLbPu-N=x(a~c;bi#jV z*7tb_^Kj#ZWA`H!<7><)$zC`!TD+SGKOX0plBb6?rqnIP`{~w$8fRg{* zE!4_tc|xPTjX^K^fm1`sVKaXTOPwhP^QHH+TmZ?-tSJT4vUAeFv|LX(n3k{c0MiON zmS9>jMhi?U`ACClWg8wat)l%GOsh)&c>pp`jr%Q_R%ew=0P)qoa)D`$C%?h8X2oI% zedS&N0}yB(xeMlNZ#f61b(ZW0)4EeOfN8y!gQ6B3*uwXKk%^gwnF$%PvVkBIgu+5HF)$dYFaUv;0RsyI zgIfRt2QVolF!F#%1|aDczz7tva9|Md@eN_nHZTTaQy?}2ViN`~8z9e4*OUtYB|>k~ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Pontianak b/usr/share/zoneinfo/Asia/Pontianak new file mode 100644 index 0000000000000000000000000000000000000000..285bed2c63a5debe034a661431d2a1c03dfb0dad GIT binary patch literal 247 zcmWHE%1kq2AP5+NDnJ+nLI`W&04ie#V)_3-(EY!U0YvW-yAP&MS1#cI@h^qFD*(~g zZH|HYxBjbv<-cs**8#Fe@m5I#BNHpSlhtd*Z@dc0m91uO}nb;2yeMvvD0Ax<+IVLb2 u^`^9dk%^g+nSr772}q*61Ejfb0s{w_WbyG0Vek$PVekTCE+9kKk_!NE&?7ql literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Qatar b/usr/share/zoneinfo/Asia/Qatar new file mode 100644 index 0000000000000000000000000000000000000000..7409d74983c8d0cd8347a663c3bfbc1c041124da GIT binary patch literal 152 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$VxIp%u<+Ad1CTzJu1N;4yNU6JixR< zjwP5@jL`zqNFW`X}y-oU|PSV1xy>Hl!9r)*aa6r<{1@LgK1;i zCNOOh6bq(JWmCYknUOt&{_6&&Eu>=tK>951YJmBczwN+$tG!%czV&SdFyCgGI+(WI z%><_H+Bm_q{j4Wo+9CBdn09PoxBxOQ^}#U(MkZz!W+rsV3KYf#S(q3Yte1e@_=YfO8<+sGDG-}6aM=J^cDklq07{*2Bme*a literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Qyzylorda b/usr/share/zoneinfo/Asia/Qyzylorda new file mode 100644 index 0000000000000000000000000000000000000000..fe4d6c6d6d44f0f6b7dd1f55702c4d640270a1fc GIT binary patch literal 624 zcmWHE%1kq2AP5+NDnJ+nLI`Uy0V-nyVuAlauu8IR0f^qZ_^$&{j6qbrdjp6TlQ^IN zqQyBjLg=5L7l8N@FF%3hC2y;P#ih=agZa{XS}uU(W!98}Y1uhxU|Oyx98AmCcz|hz z97`~*7^4NIm3*YZw6YBkm{!sL3#L`2-+^g0?)zX`os~NPWWM^BKVVwp$?pUZU$bH= zn6G)|f&+-Jb>uvluf62}nATac5lrh&Sp=r_S|)>O{gM_iZIDt5rVV2kTmb1eDyjz4 z#T59V*uroDWL}K)jRlNM%q+}I=#Z5Oiy%}H3ljr_Z30NY xg#!Z%1A|)t0|zioBrx)TNCqJ37Qo2i;~T=DZD0b#ra)}Qz-0qu+3A{c0RUQhZm$3U literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Riyadh b/usr/share/zoneinfo/Asia/Riyadh new file mode 100644 index 0000000000000000000000000000000000000000..01c47ccb86ccbde2bf9ad0803298e8df87178a34 GIT binary patch literal 133 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;j{iV#RoZL|P(b?(NVAp!1B;Ju2!pnPF$0$k KkhIe^<^lk6It`Bi literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Sakhalin b/usr/share/zoneinfo/Asia/Sakhalin new file mode 100644 index 0000000000000000000000000000000000000000..69f0faad1e7247882721bb81a7242ddd4b1d269f GIT binary patch literal 755 zcmWHE%1kq2AP5+NDnJ+nLI`Vd0xDwzVv+wq(Dvc%4iJ6GVABVXeo=Mv01z!Ek$nI} zi*saM0MkF`JAi13m-E2#lD94$0P&^HD1-UZdkhLde3>nw=@)4Ef9!L(kB9hlZH(FfB8DGFfPFxIC4WROvjI+!-L z)dSNeLE;S{aZ_12Fl}b|6GH!G0Mi!IVnA6228%n7zsz zRwO|dR@{)8m6?H|^#sWDx(N&{3=As{Fmf<3%-X=f10orLWX}Qy0UzHG25kdN25mzl TAT|VI0|qV|Aj?kI(2xrNZF7bJ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Samarkand b/usr/share/zoneinfo/Asia/Samarkand new file mode 100644 index 0000000000000000000000000000000000000000..c43e27c5d4bd341649b3aa32de068d76618c81ed GIT binary patch literal 366 zcmWHE%1kq2AP5+NDnJ+nLI`V-04iezVuAlauu8Jk97Jzj{MP{}#vrQRy#YjvNgPlB z(c&B%A@tAB3qX8{m!H7$lDE~t;!;4yNU6JixR< zjwP5@jL`zqNW6Eh1l z6DDL}usaD-YvI7a!oc7bz`y|vmjp&05Xr#f;~T=DZD0b#ra)}Qz-0qu+3A{c0RW;& BJ`?}| literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Seoul b/usr/share/zoneinfo/Asia/Seoul new file mode 100644 index 0000000000000000000000000000000000000000..1755147fab44e07b7527ce1eaf3ae991473fb222 GIT binary patch literal 415 zcmWHE%1kq2AP5+NDnJ+nLI`V-1uA0$VuAla(0%$Nf%!Mj>OKJRZ(Z*KtGm6HAI!h=>=BrMx9206|Hxkx%zu)-9c=DXVTlZo zzGq3yVEdj6`n&+~U+5Qr`7fS-0n5MQ4+8UF9lr+VzkY85=D%6K1I&MWUJT5C*FFo( z|6p2J0rI!P;)DqxS}`vjOe-}zfoWww&k2l7EX+{I$chBPVhjxB93YM59SkfC40RJ2 mfV`dsj67gAP^5JRBae@72!nTU2!j_8d%J`%Z~-~GmRtaloVXbP literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Shanghai b/usr/share/zoneinfo/Asia/Shanghai new file mode 100644 index 0000000000000000000000000000000000000000..d6b66984a2f36ae36b35e174756707aa7286c292 GIT binary patch literal 393 zcmWHE%1kq2AP5+NDnJ+nLI`V-1uA0(VxIp%P-o_>38EKFU(^7i7gn--0MRERr?p`IRaYgj{57BbVE%QR{b2qL zwzL9}IX7iLfz{u1toZ$;V7>;sJD9I=$w7dL5f5ZwD7+3bpl$*q3j;$z0|SSTZwQ04 P3lIl~FmM40T?;M%d{}{0 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Singapore b/usr/share/zoneinfo/Asia/Singapore similarity index 100% rename from usr/share/zoneinfo/Singapore rename to usr/share/zoneinfo/Asia/Singapore diff --git a/usr/share/zoneinfo/Asia/Srednekolymsk b/usr/share/zoneinfo/Asia/Srednekolymsk new file mode 100644 index 0000000000000000000000000000000000000000..7fdee5cbee2b1ba0904a672dde16240404466fb9 GIT binary patch literal 742 zcmajXPbkA-9LMozHq4)clo{Ln8-^MC&HUYr`M1~>X&1xEpJJCK2XVwf=FdS6ODJSC zau`WF?4TS-k{p(U!eJ>bxsc*{K08u-*7Ll2KYM;(n|)+hL!vGoeZe+cw&9aVx zQ-0{$&!~829&dRb=^aT^RCh5&Vn=|PE*!mqpBs%#acCX?X9RBptTV6VXo+9#WG(gP zLfKj>%yRKz_S6T=alF9X-g}s5zJPMwDa=>y!2*dJ7ADO@h2SL2<|{sSVbSw0OHw@1 z8S!oo_a*0(Q0a5P((OK|TCu{i83QaIFNf;E9LV)soNSP0OaUwE%b>P90anUVU={Zo z@%tUtNaDlnyPAhPbnRCNUFSbR>w=eP{mw0{KRbYiSs!e0FTuv4RcM^{I@!FY)(Ld; zz#_V(z>aQhcB0#2^=Om48*O^)f$e;4#A_YwcoISLp$uBCG+{R1y6}UxnZ1uZe#}2V z!T;BPpT_bDS(dV)u1z8!#1r5N32`5hWOnlC=?M^_#cCr;PEEIlZjL1C>1j}LT;eYf CU5tYO literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Taipei b/usr/share/zoneinfo/Asia/Taipei new file mode 100644 index 0000000000000000000000000000000000000000..35d89d036d07c3f28dec64092ab1b533c21ae2bc GIT binary patch literal 511 zcmWHE%1kq2AP5+NDnJ+nLI`Wo1S(?zVuAlaP;%~r1c*Ky>e&FIFNH*c>C4^KVET&F z+7BS{tFB56Ao`lmelY*K&3-Wd23uMINc^VkC$RdP&u4<=Z~a#T%ilh67A$|~0mR(9 zs~EuY_lk>Q6a&ZGE-;_-Zf66C&vkC^2M{fIdtn2J77Dprz{teNOcZ2bD0~6ZRL}s5 hfVv3`93YaB$HzB>!8tgD!3&6;T|yYRfE-;5E&yjg_Y?pC literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Tashkent b/usr/share/zoneinfo/Asia/Tashkent new file mode 100644 index 0000000000000000000000000000000000000000..65ee428ce1c5093a4b3dd29512d98a33b4c753a0 GIT binary patch literal 366 zcmWHE%1kq2AP5+NDnJ+nLI`V-04iezVuAlauu8I-6GU%a{N4bhUsSzz0f-ip*dzd= z#W^-Afa#x4CxB>)mroXeXvy1>V0o!CnP9&3p0WcVahWygU|M!g1eliV@dVTIHCA9+ zAx9fbE5^uxX(blVPk!oZMJz{mj%mjnhL5Xs2n;~T=DZD0z-=0I%5z-0sE+3A{c0RYJz BJ^26t literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Tbilisi b/usr/share/zoneinfo/Asia/Tbilisi new file mode 100644 index 0000000000000000000000000000000000000000..166e4341d6ce65728367641a467a925800044df6 GIT binary patch literal 629 zcmWHE%1kq2AP5+NDnJ+nLI`Uy0V-nyV$uIV5Vma>BZyulISWibzr_;(GDlQ><^d2b zCUMRHM2mBrbpX@97&m}uiB}8AaR*B&0tz~P6?Qn>q!OE z@-<;#S|P_BOe@A%fN3QkO)#x&BL${abhyE^s`MW)t;YQpOslg>CNKbj`d2P6t?`tz z0L0h4axVZxYaKc00HU?G902ommMjMIb*C%>^YvOIaGB9nB5@`Tb&R`fj=>Ui} zwoTgrqD_Jv!L+Gt*Z~mV%t#r`H~VV==37WR7=Xkr?n;6AmcNz2e5*Zwzh{j3vUzC-F=FyGfnFkeHV49wTKJr~T^JUs`@ z*V?B9=4-FH0M@TFKgVD-N3Tfy>vRn}m6|BM%4`GDv=uza9*E|?!=`x(p+)>#NvA0n>~Rv*fH z1uP%N5CxVGd(Q!u4}aJPmXEmD3+6{25eD<4HXQ(~k6!8qRv$C@3s^q3tqLq3SE>${ zk569lTg07m$dqyPW_ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Thimphu b/usr/share/zoneinfo/Asia/Thimphu new file mode 100644 index 0000000000000000000000000000000000000000..0edc72cfe46b1976bff562929501f202a205d0cc GIT binary patch literal 154 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$V!r=CaP^sJ2}qw}qVEbupiBr4i02!@zyf3^ bFmUL@ZNizm68z58jufuR{>FhkD*MivH!x(N&%KE5FgUM@f!9Kyf_ IBy=sg04jJ!hyVZp literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Tomsk b/usr/share/zoneinfo/Asia/Tomsk new file mode 100644 index 0000000000000000000000000000000000000000..c3c307d7b99f39328cf289360526399c55984af6 GIT binary patch literal 753 zcmajZODIH97zglk%~g|`G#k$`UW37SjPV*~a2aDT9;I9IioBu}NqJ;3^4dril%ymR z8%cRAqzFsRLLx~B3!5PTmt!wBsyj8vY$DA^&@@J~ASzUJ))M&DlxEXVYX zyFER?Joab+3H$=MUnxx&LLQQR|{=xO|ay+Um&zfCoRaL z?G^u5S@gcoNj&~o{NG~_p8LHdoP?0_752Q?KzKsB?3|R4#x5dfJ0~wG6^T}tM%zF; Nop_n(o*kd=^#inkiIxBW literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Ulaanbaatar b/usr/share/zoneinfo/Asia/Ulaanbaatar new file mode 100644 index 0000000000000000000000000000000000000000..6f5d3a15abbe48b8a4dc72aadc88c416160a56a6 GIT binary patch literal 594 zcmWHE%1kq2AP5+NDnJ+nLI`UCnaBdf0{?-a?eaSxkUoCyI}<>(#LE*6AX@U)pAR5f z>Wps#h?d@CPynK3*625YXxTYJV7^?BAeb*-{RPZd$o>rGD@I=f^Od}>g89nUJHUJu z?d@Q`s`M-{UyXYvn6J*V?E?c4sDIf8q8K!u%mDK>ugn1RwT@JQ`Py5mz0jC zFyB=+P=EmlLPckR`C+Vy1t5Od*BUTC{Hb#RBQq0;kbxn^1Y}B50Vqc6CNOd^FcdT} a@c8(KFlZZ?1FGsnw=@)4Ef9!L(kB9hlZH(FfB8DGFfPFxIC4WROvjI+!-L z)dSNeL7ZUPR8{~?n;E`_(0@LGX$xug4mcL$t`BrP6N}9&1(uk<~g}mfcehJePF(eY8067>RbTkyRq7U`R>X= zV7~jiNHFcmYyzRrS%Yb>$6{dGdz~zp_Bmtp0c5^!?|(4gFZYWBh#%s;>jNVb3o|BU zWy2zfsf>l0otce+q0J3sT0sK?3j;&l1W-DgwSj?$fnmh~Mgb6;5yEexkxD*yw8(>Mh3YI3Pz%nrq z^owA*I*z!?Zy%5=K0lBveW%D(em}Bd>mF8neb6{_0&CoBu(odt)=ha`ys0K1y;uih8-uZou{49RjU_W9VoHdVC0mjRB`ND+(i}+1!LB41 z%YnI}kd)HEIV^EX#EH>%mcixW=JOUwNKm2Badi}3Q_ z!kWK%t|7M<59vDdQj~R&-o9gZq>p6u6@Kj1lD<#7`0saZzoYg)%|uIWCM$Kox()`; z#=#(q49fa>7~ICekg7KrYP^SGX;&~@c?jjw9T?%h3Kil@p5`mw4`AfOelT@ZZ>z(r z6?~6An1;%&aTv4I2V*B&VBByOjPEi*RlN=-R5w{^p1M;H6LkidR4RwbfiW;e?dtH$ z6KbU4Jl)gWzM{3CF6dO-1v>5e5uLvL0(HA5Fk|E#X3ng`tcFdPJ#=KHc{zDgXnoxp zI#=F<&eL1a`OX#Sg0OaUfxR0Rib@=wl|#e58X7mW&~#eN)BK_dDcWp2W}L|Bk4OCX z=if)2MU3?=(9n)SCT7es$4M9)urd$YIbpZVF^Q?j%#eh{(+H+ znTdfRN*`n{kOb<9&S2nRV5pnGz~|!|!Vm<++6HFE20+r1fy)NWw$nAUGB)4>0PImF AssI20 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Asia/Yekaterinburg b/usr/share/zoneinfo/Asia/Yekaterinburg new file mode 100644 index 0000000000000000000000000000000000000000..a3bf7f29b6f14debfbd0f8ccb45f1ea338009ef7 GIT binary patch literal 760 zcmWHE%1kq2AP5+NDnJ+nLI`Vd0xDw%Vv+wqFgu=89Yik_+6bclZ(aP?0Vu~Hs@}Z; zM2krrPyo^59QzHx^v}-=K(xfmPhfe;+v*A+zSNm=FkgC4%LNc$W=$!WmYtIZrsaCV z!L)ph2bfmKu>{kKFl8s*~+NT0=B4KUyGw;h;owU-Obx4x|a z=G!b&2h+B@nZUGN8z-2ypY;SxJEXn_(~d0+7eMAYxt;~{os%Dd`7WyK!F*TeBVfK8 z>qIc$U3nRp@BVHrnD%7ufY9gq!L--oEHLf8t`JQ7oM{gLneW>d4CaUUFgh?Yu`pwS ztk{Jym9nt_{eKf=s>wkH5Zi%)1DGNc7{ zA;%p|E5=xWX(b;`Fs*DO1*TPWxWTll^dB&-#{CvdtFuZbFaUx2S1vHE@szUw#Miv? z3ruSrc@3tux7-2KI!n%iY27LNz_eb=dN8eDvH(mQq)Y_U#vPEFp z%*Yo){|y1t7SdS>3_xIU*9^?J{OtqgTkVwq^Q~{|f%!JeOu@A6ZUHcD*Cr08?Pq-g z(+;UW!L(xw-vb69aB{s3<~t{U0P|f`_k#JZ&X>S^H`e)JzPs`kFyH;%ZZPf1JPksh zn+vAB9#?>A?{)QH+ULyF1O_1R?Mnpn{nnHxFfub?fh>$rh(!)rJus|yfK1dfU|?Zj ma0_7M0EUJG0}qH~}Sr!gWb?JxHijlr}%V@B8Nuf8qPvcdy_3^Z9wM(v)tN9O;T+6VHwfr@ z)$VBIETuWjUNr)596SqiTs;MJUGBy*s5ZAkT|ImgIlsCB7UcQE+o~w^@0@Z$E=)NM zi=zEdzZ;ta?`?8|52TUs;gn8JrU@4JS3%9QMge_($-_!mnt2TMvMYJW+Vn~A@sSkx zB=RUM4~>EqE1gs6{>r6tB`KExLNdSwLaucRk9 zPjdfP!?t$x8`r;rP0K#})91YQY=v*^>)>0ymUFBS>U*2u=3>`7sB2?JNVJS zhkeg~z)z3*;AeFU{BpGh_Ma(*14nPe!Tl=ub&pO<&mRibz~R;TaKt+Ueset!zuP3j zQIi-v1KyrmIltgmJjDBGvM6g=b_VqMCiOD2D)qr zgRZh*=q6eN=gsng?$+*5Xtr5J*dZJVfF51m(6h-6&abqE3+|2LeMC9EaN(t9=#{L4 zi{dm;9G(v)JM{vd$%OyEOxd-6&i~wLX8QNb{CA&WdIkt#m@W@u$}ociJPU>~wh?Q> z4j%hu3=R+rdQYZrkSoYKb}kf4*eN9o#A32FP(dtZY{gF^W3!(~?(OB{C0-;J$t7ak HNi2T>?l{e1 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Atlantic/Bermuda b/usr/share/zoneinfo/Atlantic/Bermuda new file mode 100644 index 0000000000000000000000000000000000000000..abc75ea7ef87f054cdcea06728b99e3540108860 GIT binary patch literal 1024 zcmcK2-%C?b00;0hwU{@v<&QGw%CwrZHMi+>POY@*$Qq5D)bycCq`62!VbxxOa254p z(C=RhNu*x1updSdv&DL7*t>>uk6vApXWgC7S~N#=J4heVd) z$(I7l_x=bx5z2-?c)UE@7e@3BmXX$W_+x(-Jk`?$f6lB$f4a?w^V4&4cpkNM!qGP& zI9A+;er)hQJd@f1&-gCD@h>(w(LE%v_a%>}e3Eaz3_ymHKO5cuqJ*DF8!u~H^1`2+Q}vd>uvG3!@AKD zxa?FNtiQy;hQltA)`+q9J6vw7fh+b-z$Uc{t~5S`tCmWzSs51SF=9^6!qtCpDyn_`NL z&a~A3H6Y1ujR!L(e@ z1TZaM(+H*&a*DvTVoWlaR`Lk})5l@ z|3{#5Ao&3tlne|U3=Dh%j66QRAq=_(h794ZAwV1)!oUS&8Gu+izQ%f{dItK2I=+Sm HAQl$@o9a^A literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Atlantic/Cape_Verde b/usr/share/zoneinfo/Atlantic/Cape_Verde new file mode 100644 index 0000000000000000000000000000000000000000..8f7de1c0a19a8d3e0e749626c76c8d4dbd3c4de7 GIT binary patch literal 175 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V)Gwp8r5F>Dj6UAo|SIISL^9Qb~;f$Q*9*?+%Pi vjLiT4zx=|$@c;kg2MjF#|9||z$N?f5IDC9V7<3JcfY^|M%LYi=8FB#tdL1f2 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Atlantic/Faroe b/usr/share/zoneinfo/Atlantic/Faroe new file mode 100644 index 0000000000000000000000000000000000000000..9558bf7180acab14d3b3f63c956f5224f680b2a3 GIT binary patch literal 441 zcmWHE%1kq2AP5+NDnJ+nLI`V704ie!V&4Bi(4D&^0?1|%Ren7IM2iXE0n_5lXCd_G zePCMR@p>>Vd3gbtmO4BUOiSjNmeXKbzhn=XHb_|urVV3n3NSL^hyVZoTmiBh2v`^x_yia^e0)O~ g!d*c)ID~-<$T9%2bbO8VO!W-(4Rw4C4L~d|08D2^!vFvP literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Atlantic/Madeira b/usr/share/zoneinfo/Atlantic/Madeira new file mode 100644 index 0000000000000000000000000000000000000000..cf965c3f9274923cc8410311741b0e30b06339bb GIT binary patch literal 1453 zcma*mc`%e=90%}sLkh83$vQf0vU0tlN=a~q$*yvJggpX!gg^0oouf;-``FoZ__ ziS#}!I-(DY#eT3vubWlX086JzVEM~>iafufq!?DFTtvR=!9&E)6I8JJY6N_7E*RGM z_`_Nko{a3Tb8>{v&@%}eInJyzcCcyiGDY?^KRv}dQ7}#7S2ADLKKB1; zx#x;{OO0;`skcg%sJGU&;GDKF3)I_k!jNzGRIp~{quy~;6ZMW*Z{%N#Ls_HQ_toj! ziTay^wXkc~08O6LZPgCn@~h#y)rG9TGGNbGJnZd>hVL7%z`oM6u)k2DBjdM_kk<#-tF^GsRzjnp zid3?X-P+wdbD29=YAo+ksiuV#^93-gI{CevRVvlYG{wA3T`q@<)qvzFzPpEn+RsdD nnx<@N5u=FmcJq=ji-gi*7Mesh9u9Up>}Y$DjfaRPcUu1d6@tXY literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Atlantic/South_Georgia b/usr/share/zoneinfo/Atlantic/South_Georgia new file mode 100644 index 0000000000000000000000000000000000000000..7fa5f4683538498b93d1e639c14256c1f033c354 GIT binary patch literal 132 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;j{iWA+4lDUtpt<)!qQLS@ReLJPbe`v=~LYgA~y!6i54=7kyd zpPa&h{bYD+WexuEjl_?$;xmvTvh%Vu5S4c*Cb59 z)~cVd^{NN9r7yy^!`HA~vmIoj?5o`>W$nMOu;XJr{4y{F*S*)PQfSDX6CNhc-ND1| w!#Vf+7{fJ;^Sz)HDgGuei{boKl^)ZCMb^D?vbUo1WuxdK(FUfm2vr(2x9gG87XSbN literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Australia/Adelaide b/usr/share/zoneinfo/Australia/Adelaide new file mode 100644 index 0000000000000000000000000000000000000000..3bfbbc563cf97dc2548ff8974ab23dcde28e8744 GIT binary patch literal 921 zcmWHE%1kq2AP5+NDnJ+nLI`UK0V-nwV!r=CP%PFh0-~#hm zeZaKrK|wGrSGgEW%TM3Q0WwD+vK7o%Y`6-hm7ErV#g#KZfoT<`7BH>qc?C?XF{OcN zbu(Zz ylXD`3UcZiki4hGlF!Wb|WM^$)WMN?FS-`;Q;~T=@=;{I@fN@HuYhizMQ z+6<~xl9$isYO!#f@J?|NLYVTo|c^ zZ-=`uzStwFbPs)71r(C)B4xvI8?xb7IZTuU?nf&$rhey6=%H!-HQaGON2K*hpT5E5 zYY8yrc^sym`U=ycV=%q!70d|Vf|-_4xU=CBck?F9@*RV_lKNHJf4B7lH?G1xx)68d zJj`Bo!M!~-&^(h4Etem{eRp4ov`@~-2(tD12WYE&fPQ=H2HbD!hPl=6x$8gSfxHRs z;yajUjB=lh!-H#G@KAI~rE?t1cVK?_8FW4kLs!FXC=E11chhO;X)l4^QW+N1S>R!F zE-dsg?%zb{%QlO2j&EfRx#-Upa`E&W@{!N0$R)8KuypDrEQ`#-@_R8@aqcnn-mH&D^$s(Ev8(;e$k^bh tE`_m3lo@M63iAi+wMIr0P?(8+^NWhTl3xxej*we&x}B0ER6w}ArhoaP!bkuB literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Australia/Darwin b/usr/share/zoneinfo/Australia/Darwin new file mode 100644 index 0000000000000000000000000000000000000000..a6a67300dd5ef87e421c9749702039a6bdbb928f GIT binary patch literal 234 zcmWHE%1kq2AP5+NDnJ+nLI`W&0xDwxV!r=CP%Jhn0z_8}F&BX7IesTQ!1Nw74iJ4h zWEX@!o&y#?vpp6}pIz<;rq3;?0?VIoH|StwW`aTnhN=}H*VIh_*)(|tBPRnx>kI}K ZAKwrLN9SM=;S$2Y1!C%2S{WN~0RXyMNZ0@X literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Australia/Eucla b/usr/share/zoneinfo/Australia/Eucla new file mode 100644 index 0000000000000000000000000000000000000000..9080f5cdb1216ef6397e7de6205173caa794c646 GIT binary patch literal 314 zcmWHE%1kq2AP5+NDnJ+nLI`US1}b9)VuAlaP_m3`1BjmEcSQtD?{Sy{qECk$fzZdx z!QyAOXMpLm%OgcV_HgolgwWggz_b)&1cY8*3Z^wxgCO+!{Zl~dT?@B>X*bpwFzv2f z1eSMyR|%#)nL{A-xo8n4MhwWnP;midOs5PZ3j;$n4+EEvZwQ07fu)HlkhB1jTsC0Z LPS?W9#FPsFy<IpSMAzT=$NdH;UD17l3?^!HTJ zsv{&%@Wmsq{)#VoOq;xNR+7^z(sy>~U7y0<9<>sC=c5aKS2+%YFUw%)SPPt%9}}OO zp6W)wdG3X=NE@69ox}cH)r?+z-H%?124G^U11_H*!Tw65j=w&U_lCjpPzIWJzpT;FH7 zX7D~->l}mY`Yyxu#(QwX;hvPsmtdY_56ssdfCVKd6@Dm~ml!G(S``>M0gK}0uvm3N z!?+$APnqDRn^EG~+z~*RC^N9Md5D*3i~lFwT6z&~+Z%&rnl5NEr+zon-)HFZUvY&W z%yWb2ir55t`;!Z3%Y!hwa^MJB>{rp&UMJdi#*dbccET#}RjgMx)T3+cr_nnMMzlR| zAKIQE^v(qf+VSZdx;F9y?i!thbz>ESc3xj8CBH~ZPplON0 zpFt`XLL(wI7^I`5G10-FK}?!1ItboP z9C?*|%VSnGmt=i~U%p3{Dw`vNd|e%9S*#tAknt&4&9%eoNI$H3(!!-n0$g^jfXnCC zMb=lbd6Z#U=@nsZAdY%f=UR&0SNmU3uc?}bb$vIm?)?F-)komk+bdX~y8`Qvcj3CX zN!YLz6WM>p#InS)UfO~A(+Rj?C;$r^E|`wEVABi_n_GF>O^nPoQo;NTk@i*2^f|wit!mx5KbwEDU!noT0zdDZyQ%A-J0l ziLBq*H3#?P*irAT_QJg%!4#*+`kmQ||4c$cHSF)TJ(5kx{sosyNbr#46S9566}j9V p(%~HR5Cf%VLEZ)Ilql^ux7Aaj*(}JQ@{t&V literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Australia/Melbourne b/usr/share/zoneinfo/Australia/Melbourne new file mode 100644 index 0000000000000000000000000000000000000000..d3f195ac2fac23afd46cc16650e0a2454f5a3923 GIT binary patch literal 904 zcmb`@%S%*I90%~iM0R@f%RMLR=G>;Asy4{+1(a?a;`f9KqL;mGxEt(kOY zY19)uxa6~6@v6r{)e-quEuUc^h8?}LsKB6&*j4$xaHR$Pwb^@cJ>Z6)$9>q}@S7F& zTNL^*4~9j=b0qCuBeM3;0ngb^gj;b?7xi5@^9SmGEx_|*vBVYr8h|@RI2jyjN8#0>Y2r$(>p@QHe2$!4`U0l39l+G&$1tsG9bOA*g4fMc!i_a();$wWy@faT zeK39alfnzj=2Mu_^#)p}+oA1|Q{5%94|@Pwel zXdo`f&JX0gz&^|mF2jQDZQ?4N+=WH+LFgPFzduC&J^s(gJ53nTlX24B_Q+J?D(A^7lb+`c$<7^% QN3vTbtKH(sW^7sde@9iYAOHXW literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Australia/Perth b/usr/share/zoneinfo/Australia/Perth new file mode 100644 index 0000000000000000000000000000000000000000..4f771828c9b54d9bcaef82639425df4b3559b5e1 GIT binary patch literal 306 zcmWHE%1kq2AP5+NDnJ+nLI`US1}b9)V!r=CP_j(y35cHKcW(ih-s7zRqECmMhtS6x z!QyAO7lG-s%aa!X^)hhs|Ax@pB*3&3V-kd3UJs@Aq-p~ IQrChD0G5hMm;e9( literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Australia/Sydney b/usr/share/zoneinfo/Australia/Sydney new file mode 100644 index 0000000000000000000000000000000000000000..1975a3a4bd0ed93db1d10a2c562eb5bc3baaa489 GIT binary patch literal 904 zcmb`@%S%*I90%~lC*b>sI}i6Fw%A={F(-JvHQXgzoGtg30@dUB~H}0Js92l3&zYX!r1$} zFm7-R#+NU^gs#Uh(exfBHMI%<3_ydU9wtXURd|t-^-#Fl57RVt!axf&9^}DvzYAt8 z>7l867+!o6Bu?htUesC22F$L0%WcYOKY^FBdtmO3b>ZnTylkEpZmvPI?v-$Q3g#dA z;FZD83NI{MFJVE~B(w%Qpsnczw7>R3>0UD|>@0yrWlmV!kPJ&QOz^7oQ+P(uVKflO zv2%#JG;jp3g;wD8?QP;XCk|lQdHh(4WwIUs literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Beijing b/usr/share/zoneinfo/Beijing deleted file mode 100644 index 763271bcbbd9cbfdbcf15b35bbf389617678a7c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcma*jzb^w}7{Kx8s(v+wi@kMrL4VVaQcwHNO!Yo= zYS;DI-ODh2+HmG_$KibO%2}B9?abndlNprl?0C`1cJg-28ghu7_4J>l7Fux;FOZ4S zo-2iI-3KlYbh&>In9|qGfS=|Ik#AkKl|l{~7#SKF92wrI0gwnr4S~c!f*?_lFi0FE x5E2OqWz<;w4#ALUNH`=O5)g@qghXN@L5&&}32W52GNi2)`%m43hF)4t`~cK4x{Ck+ diff --git a/usr/share/zoneinfo/Berlin b/usr/share/zoneinfo/Berlin deleted file mode 100644 index b4f2a2af6de4526f909f743425c0858d32cd14ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2335 zcmd_qZ%kEn9LMo<`IExPeZ}CKfKWF=>}F`LEmveU$7W8dvHHDFTebC|XFciMd(P|JGk9>f z`+57;Y^q7O{&9qvC!8F6&B=Y_4s+>>aIWtPT%0&C)~DS)$MuzWR1dax>R?!d4viPd z+1H#pe8elC?#q;OFD1%|KUzjkbXcQhr+17VULm8GGAGVg#pq{6E)C?2Bm`>5HE?u` z^?7o?TyW2kFTy%xEa;4mU2T%c;m(O!B}?VDj9)a$^@B#w`cj?2XVrQAw9dZrrrv)3 zkj{C3ug07_C9%i)B<{dLncJokzwJdysPoGm>#F3=VxPEj^W`pgwj{81b*e9Lox1YTmvvR$1}(j}PJP9N`iOJ6u68Hu>YE-diz<+^3z7QRjd`->#80|55H9Nu z&6M)~ALa3u>r&A^EbA)*Qn~$mePZ$3QdK^r)$#jfLtdZOOh2x*ajLc7b?U|`zit|A z)+aCf^r@q3weF(^d3txA*7ugm=8f_C%&shHSeYyS8mDYYn=4!Mf0k!wTGE&rrHvC` zOVf;-+H~#%X}&h5&%M_ocC$s)70HPf{<^F=0%%ov$6GG|*eX}%`2My8F-8<{vVb7bnaX70%3 zk=Y~DN9K>}w!@@s1njAYo>q!`IDl4K;yNScv6BZ)>bZT*ir9c~)FAdQ;4OEOZjQatXG KG!Ld`g#Qj|*MPME diff --git a/usr/share/zoneinfo/Boulder b/usr/share/zoneinfo/Boulder deleted file mode 120000 index 8b727a113..000000000 --- a/usr/share/zoneinfo/Boulder +++ /dev/null @@ -1 +0,0 @@ -US/Mountain \ No newline at end of file diff --git a/usr/share/zoneinfo/CET b/usr/share/zoneinfo/CET new file mode 100644 index 0000000000000000000000000000000000000000..546748d6eace6007bc1239dbe2bd5c324623ca56 GIT binary patch literal 621 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1uA0#V$T0SFq=m_0Zd=L^#MfBxw&ovh@QJ-E0~_Q za{`#2-!dIcpWrM6(`TN03xL#}T`3OcpIhV%=AWNr0;VrCseR?(ZL;_3;`??5#)QK4X0`og0Mk;3CxU6|J$nT}=E$sB2c~7`%m>qQJrlsRd`%;mR>&y=(~2?4 zU|Pv11WYU2xPoaF9WyYkDx(gj)p#Vpv^uNv1d#daUroTY##2==t$9@pOluuw2h-YH zet>D6B`?9W?vz_#TCe3anAR`Z1Evj9)`Drn*qZ{3z}O`nGVlp7umU}-z{ue28XN*7 cLKwJ!gsvfotK(~|XR2qQ<7;RDqVH~#>qM$UTWoXN*;0tXVQW7F)L2-u~32Yc6LfDWYA*c&9 z0Zn`)Ks6y6F`~rqFd}Y@5f(f)8j#?|5E5m4ER@y`_k8~V8}8)ZbAD&ONoH|_=jtxG z*@jES6SQdsH~!=-k7@WeD}43zJ0z;TWB){|eI0Rd=>9xBc|8ixrvHIwYxFYZ*8bKq zs^R4T9QhQ0|9`N<(GfeWJT}SnU+k_4MRjczRyVK0F_(=ZHJX}OiRzZ}AMn=V@37W6 z4Qo5Cu-^O<)<1hhab}Qj!?8=^u*gsur=xu;g(JZll0@1BASv?;JB zd0D2$^DPP&hCjkZ@0Z|1^8@hV=MjkpM_%8AkKS5@k3A6K;)V(MczdTvxf3TJ!rqGw zurIqE_WLSe|LY1ujR!L(e@1TZaM(+H*&a*DvTVoWlaR`Lk})5!685*gnK*E#@09knm?f?J) literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/EST5EDT b/usr/share/zoneinfo/EST5EDT new file mode 100644 index 0000000000000000000000000000000000000000..50c95e0cb07692f2a177a505041a10f284cf0a60 GIT binary patch literal 951 zcmb`_+iwg}90%~T+hyC?t*%SyUA5TEc1?G;wpW+Z-Bd}VVH)LW2;Hm~6Ou|_il~+c z5or@avQ)J6p{eqsNK=;}5ts7f7EV2gpiJ-}UET3JUw=Sf{3hpo^EvZ9nU_(wMVkX` z+ObeWEHUczSDL71qvbMbVtskK$a6QoXd=&dFu3Q;WBAcg1Abok>tAYdE_#!{n+%ch zPgU@rmzD6;!(2FVJqI=~nVi1G*r|je!qPd;MOycBI7v@v!ZvM67dfMWYa(Y>zlZI< zJFxwDCY<8B2&W8meU7Tl+Prx~2U*X)_PvN|wC-B0a zAvnK<;r^mSU2s9;2e@$eAZIj-gZJPi>rcW<)B9kzXCLfN+|@--mKtICT`%nUTm~17 zbi&>jszx=oEEa{8Yo%~;+XmRzl>z%B5kvF>dne(N+B$gornhj=T?Cf~M&L4gDqNoZ znlqa6kKf^n_$|2d{uo^KCI+t<{HBZE%9{t_RVSXotIzI$tM^=m*R&tdsK(ZA?1pQ0 zZihp~EpRwg1BZWJHZ1hlTa#$}&yQ&iUtu=Wd@yQZ*psn4!y%Q0H`Cfet3hQFAxMYb R`Vu9e_`LOgzv5SX(qHJV`m_K5 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/UTC b/usr/share/zoneinfo/Etc/GMT similarity index 100% rename from usr/share/zoneinfo/UTC rename to usr/share/zoneinfo/Etc/GMT diff --git a/usr/share/zoneinfo/Etc/GMT+1 b/usr/share/zoneinfo/Etc/GMT+1 new file mode 100644 index 0000000000000000000000000000000000000000..98d5dcf917c6f1d9bd0018db0dc4dd0590e6a8ca GIT binary patch literal 113 qcmWHE%1kq2AP5+NDnJ+nLWtMG^8f$G4-5>t28Ik=HbBzOkP859w+SEs literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT+10 b/usr/share/zoneinfo/Etc/GMT+10 new file mode 100644 index 0000000000000000000000000000000000000000..ecb287e667868e92d97cdf5fee601e09cded0ff2 GIT binary patch literal 114 rcmWHE%1kq2AP5+NDnJ+nLWtMG^8bHv0t17tp#cMz4Un`mG~faNWzh&i literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT+11 b/usr/share/zoneinfo/Etc/GMT+11 new file mode 100644 index 0000000000000000000000000000000000000000..e941412971a4d805e311e8e4e7eb37e10994e4be GIT binary patch literal 114 rcmWHE%1kq2AP5+NDnJ+nLWtMG^8bHo00V=rp&h_ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT+5 b/usr/share/zoneinfo/Etc/GMT+5 new file mode 100644 index 0000000000000000000000000000000000000000..589990ae8966d1af67f1e05c21e14149adec2089 GIT binary patch literal 113 qcmWHE%1kq2AP5+NDnJ+nLWtMG^8f$N4Gavr2Br*LHbBzOlnVf6w+OTV literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT+6 b/usr/share/zoneinfo/Etc/GMT+6 new file mode 100644 index 0000000000000000000000000000000000000000..fcb60ca2465a3e0c4febd41ac1a05bbb39fd96ed GIT binary patch literal 113 qcmWHE%1kq2AP5+NDnJ+nLWtMG^8f$p1q=+j24)OgHbBzOj0*r{_XwE) literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT+7 b/usr/share/zoneinfo/Etc/GMT+7 new file mode 100644 index 0000000000000000000000000000000000000000..c0427a40eef929dcf25451be77c74af6e9111065 GIT binary patch literal 113 qcmWHE%1kq2AP5+NDnJ+nLWtMG^8f$b2@DLn2IdT0HbBzOoC^SBHwbd{4F!k* literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-10 b/usr/share/zoneinfo/Etc/GMT-10 new file mode 100644 index 0000000000000000000000000000000000000000..11d988e10a3e318a7cba485d995872636d1acaf0 GIT binary patch literal 115 scmWHE%1kq2AP5+NDnJ+nLWtMG!obk8fPq2V(13x<21wfJ8X9l`08Lp2#sB~S literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-11 b/usr/share/zoneinfo/Etc/GMT-11 new file mode 100644 index 0000000000000000000000000000000000000000..f4c5d5cc29b5c1687e9728b6b63cd2a5328c9dfb GIT binary patch literal 115 scmWHE%1kq2AP5+NDnJ+nLWtMG!oV10?Nqjko|e4F#zH literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-3 b/usr/share/zoneinfo/Etc/GMT-3 new file mode 100644 index 0000000000000000000000000000000000000000..4eb17ff0057b8843a0b840c6fef4b77accfe43b5 GIT binary patch literal 114 qcmWHE%1kq2AP5+NDnJ+nLWtMG!oZ+qz`&qwV9dZ}10?Nqjky3h4F$>o literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-4 b/usr/share/zoneinfo/Etc/GMT-4 new file mode 100644 index 0000000000000000000000000000000000000000..13aef80cbbcf0c938b8d11d92b0755e146a501d2 GIT binary patch literal 114 qcmWHE%1kq2AP5+NDnJ+nLWtMG!oXnRz`&qwV8Xy<10?NqO}GF%4F&4} literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-5 b/usr/share/zoneinfo/Etc/GMT-5 new file mode 100644 index 0000000000000000000000000000000000000000..83a28169552f4fd39e9d0322398d787aad303e3c GIT binary patch literal 114 qcmWHE%1kq2AP5+NDnJ+nLWtMG!oc7bz`&qwV9LN{10?NqO}PL)4F(JV literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-6 b/usr/share/zoneinfo/Etc/GMT-6 new file mode 100644 index 0000000000000000000000000000000000000000..79a983e5454a35f134cd4ad736ed912f3deae64f GIT binary patch literal 114 pcmWHE%1kq2AP5+NDnJ+nLWtMG0#u#Az@Tkl#=vC*B<*y~xBx#51}y*p literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-7 b/usr/share/zoneinfo/Etc/GMT-7 new file mode 100644 index 0000000000000000000000000000000000000000..e136690e165a933fbad2fdc0aba8d97886714fe0 GIT binary patch literal 114 qcmWHE%1kq2AP5+NDnJ+nLWtMG!oZMJz`&qwV9vm010?Nq&A9+U4F*mC literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-8 b/usr/share/zoneinfo/Etc/GMT-8 new file mode 100644 index 0000000000000000000000000000000000000000..bc70fe416fdbe3abb2c636a7bc1485b79e03af13 GIT binary patch literal 114 qcmWHE%1kq2AP5+NDnJ+nLWtMG!oX0_z`&qwV8Os;10?NqEw}(f4F+!j literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Etc/GMT-9 b/usr/share/zoneinfo/Etc/GMT-9 new file mode 100644 index 0000000000000000000000000000000000000000..d18cedd524f4cc132106d822fa8bb9bd3779edab GIT binary patch literal 114 rcmWHE%1kq2AP5+NDnJ+nLWtMG!oW~Bfq_BWz>21wfJT5^GWBn-F!C&C4S literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Andorra b/usr/share/zoneinfo/Europe/Andorra new file mode 100644 index 0000000000000000000000000000000000000000..38685d4219d244f56f665c8afb92eaa6737badb8 GIT binary patch literal 389 zcmWHE%1kq2AP5+NDnJ+nLI`V-1S(?zV!{7FP-nJz3W&bqcpIdhL1xW50T3-aXFiyg z>zM$i_1pp_iI+y?e literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Astrakhan b/usr/share/zoneinfo/Europe/Astrakhan new file mode 100644 index 0000000000000000000000000000000000000000..aff8d82d2a2de0857f78217cc9d04a112d1e1a08 GIT binary patch literal 726 zcmajbTPTBJ9LMqJ^={F&3l|P!oAWG(F|%nHUS<}iq~*e)_$%Haw{N+K!C zh4Teh4oPmrT)9IjR}N`6QsnUbf9~Aud3&Bu-{*aw=i>FW^m@%K>=5`DG--IkACdTH zaz3Mf_*hpv{p5Z?*~s@;tYP7Vj8k8k$oQzB1V4mbQvJkE$b=g!-X~s;qcw-K_q4Cw z9EG|iKTMkJfyu+oFs080Q`>AX&7B3)?TIiWR|)l6MTqf{sr-Znxxq(mcvHiy>z5Ad z?6YTd&fYD|4FsWa?il8c?ZABh3N&@kz=HO}5S=#<%)`R6WoT&{f>zxKEHbzL`PB(+ znn53(v)xsri$7b?B}bX)(i=P4zUF{s2T8DeLJunz8I-({uyRZrqWh|xk7!5NH@aGX zfp$9X(KYfdv@87-?Rq_jwPN7Us|{H9Fahhgr=a_C)kpU?O!uQbZe0g;^Lva>5F`FQ zGC?MYw1j^|L1fIRqPwz9OvYGEqY%aai^TYzO%hb@1`o?I74m82)4~*XzLpy;ieIJ! Bh!p?; literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Athens b/usr/share/zoneinfo/Europe/Athens new file mode 100644 index 0000000000000000000000000000000000000000..231bf9c3b713e3676dbd8f3ced867973c601e104 GIT binary patch literal 682 zcmWHE%1kq2AP5+NDnJ+nLI`Uy2P$I&VyXW?P+~vB1w_woP;3CvJ8ND(0Mp0TUjWf3 zKP7|trvz36fcR&gdkcW*v#WeQfar6JB*60LCubIb`1gh9C4lMeTmc~WaK4F40MXnM zUm*0^bs#PS&))f9ns-TP1Bk)b6APyKTg<_3w6toIV3%fNXfcPTD zhrs5GD!-lp;)@C20n_5lXCd_GePCMR@p>>Vd3gbtmO4BUOiSjNmeXKbzhn=XHb_|urVV3n3NSJ= zF*C8Uu(E(?;vq1QY(P!|k}M1iS_X_9K<_Is@B#y0fI$$%W)$`D4PkHuVprE-5D~)Q f48}kX7m%lG1QOTrHP$oLGtf8I@ijC6vrM=EZ;PKG literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Belgrade b/usr/share/zoneinfo/Europe/Belgrade new file mode 100644 index 0000000000000000000000000000000000000000..a1bf9281ed1bc2c9b82ee64efdca60b4af762ede GIT binary patch literal 478 zcmWHE%1kq2AP5+NDnJ+nLI`V70V-n#V&4Bi5NGqj14N%%p|-hMG`Exl*207zbD%{nkG zJ7+$amg|`SrsZoI!L&k75tvqtNe0tOJ|SRQ*~S%2tLT`4X;m3@Fs;TT0jAYiohN|I zSO01PrZt|bf@#gGVqjY9C_9+e-tq%X>nwQ*rgf*>0@Hder@^#-$sRCmkg^s`8^+!g zU}Pc;85o2uK=$(qFt7l9sldqL;~T=@>dvkd2lLM@at8CyPci}17n)ST^u;1E2)%6@ z14#X)hAgbsZ@%eS>ov zn7+w$5UlRz%L)NdI0*Z?fN2rqUlTxlQRUZQT1@y3m=T6)i30g!%~HS55%?40>vTCQgTn3k_;1k(yRMPOPnCK*gC`GkOJWgAy8t)gQF zrd4Is!L%BW1ejK5b)En+U;V2InAUiz3Z^x$ih*gZqwHW>d&>_nt+V7MnAV+g3ry>^ zoCeeSC40cMLCRV%Z5Vq~fQb-LhoqO>@p^wOVUsb1!a_h#+h32XiZ-QDS9*B1JEZAyHA0FetGf zW&{eewrsjAon_86r)6eal=d>U96^wjMNn1*(l2(O@BRSmT+aF2?{l7e;9jn^^iX9k zGwo2o*}QD?X!_hsubkwr_9i6sD{mDGVHg=4ah!)3*N})!PbN`F~8|; zbk5D`{m8f86vMXA7TEsO2mL-7?C|WcQUC4p0^~b2hheA9?4kNydnfEFR>44Fsg&y7 z8W#Cp?s3?Y{4?g<6zu&z2JcVQN~yo^?GG3Xe}Mfx5jfzk@zDN*h5+(IS0)@hQ4b#- zya0zvPQu5V)gI~}-mnMx$;Lq#Dw#k%6kPi!_7 z$-Y8S>N}VoKN9oT02EJkz>J6oN`~rSX0V^7bF$j}a9N`pF2Cr6D^6EK=@C0zxwjmy zGFzc+lL@X?=0SOu0H;aOZ*G`0?%at literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Bucharest b/usr/share/zoneinfo/Europe/Bucharest new file mode 100644 index 0000000000000000000000000000000000000000..c4a391e73b97e1342d352c5cc15a0bace202deef GIT binary patch literal 661 zcmWHE%1kq2AP5+NDnJ+nLI`Uy2P$I$V!{7FkaPY42Z-Lj;S!kMY4_ncVy03^S6$1E_tZ$&ql-an%TOdsgT1=9yB;=uHw41X|vIKlx;AMr2* z(?>0o!1OTr-FD8I!q2LDrAX?a$`vQm-F}{!hqD7VOHh^d`;d5YG zoOwTl{=5N9OFUi(rX?>=0@G55o58g7p7jhMAhTuxn3kP05lqYVG=XXPnqn}mkdp$Y z6=Oodw33e-m{zs{1sel{ijD@DR+W(i(`r0iU|OBkv;o9W|H_pBqBWlU2Gg2X-hgSX zBX_~H_Lg&CT4%|AFs(af1DMupnGE)?e#s;--yo$F%r}f(_kaNijEbtk;b3&K=K&)# z6B&@1fkC1IWE7ADM!%K;BL^@z6c~7Yd_x$VfY{YF7(|3HZ~+NjBM?`|*I3U~&p_W; M$JfvR%rfBu03YwVYXATM literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Budapest b/usr/share/zoneinfo/Europe/Budapest new file mode 100644 index 0000000000000000000000000000000000000000..940be4670a64ece1265dd28523d78a80f9008dd2 GIT binary patch literal 766 zcmbu*+be@%90%}sMj|w^1LkaI%xs2I?q*lKMcyk>ij=rm+6Co;wJW)J9U{zW&V^E3 zD9Z6d&WB+xv@nOeA?0ekzpp>Qh3D;gK7F6}_x#=iSJ_aX%ltV+LIq74+}}rvg)*@) z!@q^mDDQTV!(s9o=(_ch4)+pIj!dn>(KQ~9*$3eG(5{5;Pt>&{J1w!ulWafS|5!!8 z!{-v@qj@>%j-4jtlb$?yYE!|p!4?noJMY}LkQZe$Jb76nZ6{rYJE*(TtibD-X?PRz z`#g8R7V6!vE!e+z&iUxvL-{-2q{K9#VU*5KP`j1hp+DAqk z?<}M=^#sbIHlbX+{OgAkDjs@a%!M7s?sW5XE^d88LMj)QV7y}tCUo&Iv8@9pH8sQJ zs#=&*%E8nkGfdMKK$TJr)58={9c1FEzxp!|W_VRlvHTQ0uOyncJKS>nGFcA_aq?F|tlevNxjtLc(Yy(9tYt-fI^jg-S ICv%LUKPFBV)c^nh literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Chisinau b/usr/share/zoneinfo/Europe/Chisinau new file mode 100644 index 0000000000000000000000000000000000000000..9152e68594bb66cc756e0407654a203952fbd4e5 GIT binary patch literal 755 zcmWHE%1kq2AP5+NDnJ+nLI`WI0V?AJVzvK35Vq~a4-h>sdp-|{-oD`y2Z-Kj_c;Mf zzn=r9ciry=)4R{tf$2RbRz3j9@7*yAOz&IK4W{?cr~%UlIE!HPIAeJH~pOdpPL z0Mkc248inK3negpOhXtda&?UwY4i z4&W>45UsuCTmp#JS+Wt#*PXHf%-3s~ z4Cd>XOak)_QcA&m!`O8XfXW$+imESw>61MV7@1g@(IFcv5OT0%LR6J33=Gm7AakU? zFaX&S6%0V0mH{IVFoYBs1Q{6k1Q*0LSs)l?_R(6_xt_b-EO;|Jp6o=H?`&9 zFgwUehJ5Q=GMH@!%xSsFjIbV_hM4VElK}^e%!xT&5}KG>*b49F>-@t7WdCCcAN|BT5!Rb6!lxDr*7-iz zprQn1f8(GAHVuctXZ5}CdDR9@)?eJJLpNvJ!V6D-|tkR=Tpw17xFHlHIe@4#mf=s9|2MDXT)K+>!gd;j`g6IH>S`l%{A!NX&tzhTmsjXjj`l^q7&OLAaXqvP&c?3>KXb%eMuUt z$^jbkV^}*jAa6kijjHWviW$b;60}Li8rrnd0&NyIiss)IL-UYkXpzK++oc82Qn3iF zT-50lGpv2up^eU4Xlq-{I#B_4Xw#rwYX-C*FXEH?97@aK&X!c@cr6_| z34*%<<;LKBpvWm;0X&eZ7A^HaAzyCZB43bkvnbSX1P90&+W6U*=2~R0=B@qQlCE^2O#(e}YDen*dSF1_@ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Gibraltar b/usr/share/zoneinfo/Europe/Gibraltar new file mode 100644 index 0000000000000000000000000000000000000000..017bb2e34746c8a11c6955d49cc492c974412801 GIT binary patch literal 1220 zcmb8tdq`7J90%~bragw(ikvoW&C0EbSm$uV`id!*>_53ujr_DI8a5m+gwIY)!bVd*Y}#RENq_UYJ;*KV z8=%wVMcwI}2U|rlhV-=-?uKnH32Z;M0d`bSurtFXBz;}XAaeJS{m^9=q3#;j!Je!s ze2zO)f%|(?{m33kEV3tQ66ZVve)M~dHtc(+_}K4LUqJ2~y9|BdIYCE0!~Q@dOTNde zwoc^NO=HM!sy@MiG7;+jf_CJ$=528Ba4zaYJC(@qXa)v!VetJXJN7?BE8xdPG|RoS zR3yKHfj{bD)KEEG>}H|3@gj__trL>I7+V=!Vkv==^9)>i>NJ#Qn_=wUOt?%>!{r-O z;0o1R7#Aalval#94^3vs{qmoy;mSZ9RCq*C**piXsv3nV>oANj@Im#NHkgoG3pEGq zP`mG?a2D@>C!hCcl9T+uoev59*PNdIH9>w(xR4h@q~>yeos<_wD%1k3BlHHEO4>zJ iTZvn^MRE#xxP^dQ#cRn@Wk^)7QEOBNt%jJ8DEJK=B2RJv literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Helsinki b/usr/share/zoneinfo/Europe/Helsinki new file mode 100644 index 0000000000000000000000000000000000000000..ff5e56530570974516d249927952c69da601b664 GIT binary patch literal 481 zcmWHE%1kq2AP5+NDnJ+nLI`V71}b9#V!{7F5WGumHi%wQoG%TcPoE1+0MTa-JWT+q zVGvcm+W?})gwKI#apwIH`tt@bE%A8$1fVp7S)C_<%vb+v z0;V;ds)A|Ft72eU>nJ;z*52|1OzSLp38re#ss%ZIH4SOdH1D6kud# zA_N&2#8W}m14&>|Y8fzc0KKZf!0Y21!r%eKuCBo#B7}hpNaz}YxH`VZdZu~?`o=oG Kh6Z4k2^RpC0aq3P literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Istanbul b/usr/share/zoneinfo/Europe/Istanbul new file mode 100644 index 0000000000000000000000000000000000000000..c89186687300068ac4e8505cc0012a1dbf6a9960 GIT binary patch literal 1200 zcmb8tYe-XZ7{~E5FSAXTNrVmOrEG3GwK*+k&CQxqv}sGHf@y>|j6@_03WZimUM>(6(qq%OZe?4YG+iU~q@#8%7`<^tk zL+gW{&{qJw{j7-*faZ4j>uX9k_rVRLpDDSEXC!_7&UM|3ozBb%#WR9z9=R+a^~>r-L0 zN(y(x3!zxVhcSU3DDjsx(ETOutx)=n2V)(7VBE_EC>xrA@s_tRp}oaL`x0C4qIaIW z4&_ysVN&@M%oQiPU~+mlOer`6cZHkaZpC4*D-}=~cDjM?tDMb5r+G@zd!ELi_fD(O zDytTzKaPOv3u34-Gccnj0PbrQx#)iTb@OO#@~ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Kaliningrad b/usr/share/zoneinfo/Europe/Kaliningrad new file mode 100644 index 0000000000000000000000000000000000000000..0ec475647055bd235131c6620aa46da7f43209ac GIT binary patch literal 904 zcma*jT}V@57zgm@w5{f_C5byur!8&H+^n^^TBWr*9xbcLVy}mCaPYfu?lh^CuRF?y0IxIOm&(HJzOm70uo4z#M%6aDC<9YE;ROGxj#afEr z1zFjc<@Y7|$ExRS@q!uWtyv|=xg>o9x%AoHMb5Sd*I-$)3zlC#3)ghUp#9VVxb{dB ztO##`mG#wdo!bf>HY?wbs`5?HY4FFnael3W)gNWJe%1(UUVMkHkp<`;%);86X}BRV z4mX}lK~Jn7ZaVskxV#-h(AO{w>-JxS{<5oZv-f1qU+pkZ+8yU6@IH#X_2+TqZR39A z?b#OO`k{TWVayG8bo=1WJ~Irq6~SEz7jf-YzacBJmB@{bIb>D&g4|>nLvF6jAUA)0 z1NZ74<(zm5TR!x{P$~(->4$M{B3CXTYhl-!Wzye6uhTC#{4;c7@qfn(JyBtRZ*H?o zqBj>%9#M@)5+7o-(`xarf|7+-s07FIa6}_Tjq*Vwl^azwk!YisA#!yp`P(c#H|PHHzu!G~_`JUEE&~f$0>42`z-%G!4&%({7PrJQ~C zf}FE=2Xg~gFmLu4>PB~9e*X&8cTB^Amct;;8~Wy;v1}O@)(=9HdKeZNn*RK1gXY8m zKh2r%9mvI>KID?4OytsA3$kV14$BUbVEMQPS{E6#bw$96QB{!MtE_rLwzq#HJ2V%_ zRrUwuYHpPw#uCdXc?ub*mr=`?sW`RFu#b zdWDOO>E`LlY(0}QR$V8^`0uc>NZN%coJZp%+U@bO9KDgZiFYCMG&p#>n4E8UM)@zw C4T--1 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Kyiv b/usr/share/zoneinfo/Europe/Kyiv new file mode 100644 index 0000000000000000000000000000000000000000..753a6c86f38586797589233f4528837f5b09151c GIT binary patch literal 558 zcmWHE%1kq2AP5+NDnJ+nLI`V72P)$LVx|8;5Vq}j3W#1Mxg1PyT_TwP;-5OJcL7A7 zdG0L$qR*}rp8%rIEpi6)&z)US0J2Y1efb3tEhcft0Yr;)+ztTKzxWS;Xo**RV0p>g z&JG~H)S1a(zVx02A3%JWH50+K?3^YrE!R^FrsZo=z_db6D414^aRbvzKIULr*+v6Q ztLR9AX;m36Fs;V@8$$OgJOG)m@l?D4L~CB<0MlAWeu8Q3Ew8||&XU_;T6fABFs;|J z7fkDytOL^qDf7X!VeDxJ5HOq;7{JKH%*w*b!pw#V*_q&w9q73^AT2pfnB2 zT8w7%$SX8ndE^z6R4XB(ys|=+O80#4KmEtObM|w-zu!6M&fc9B9zGFh%UJYcQY*+H zmvHedx2a{zsli#GuA{ryhQ#=xm~di}^XU-yw;nk;c^vsc<5l?ZvIwTgo+`*XiLVej zHEIM(_sC(|nX@pR$5xPa8E#T2V@;qgn~p)wZp?%^nLL;)aYO&f4Hk0Vty3^R#2EDg z(M?!*P#G56y1m&JPxHD}x{XSX} z?9p$jaXv=+ts*J6@>*d;#?KQsox?ow~~F<&ep=k!R!U~haN z?2GV(pG5m%zn=pfaJPV;_j2H%EgKFQ{efRN=3H{#S2cawc{MmZ@*9qHjlyP0m=TCV^;ItqP&e%o3AG~vLRyzRBDIKDn+9#p@ zD-8By3j#wui32sF*l?wITR53$hMK`u0eVnNs2fY_+JbrH)poy-*YHN6j&?U(tJFd} zRRMJe$|YoHT> zTcL@8Dcs1`g{CY)EIHqF#vYmtnn3eT9cWRv0&XgtgO=&TaP!?RXeDlj)}dvPACL`g zeB_#pWz41DO4Qo_#}aocFSbsZg`2ssFzZjgsD>s}naEI~UMiQVPAUv7%ynE`g$z$e j5As0Ols~w0Dk_2U`XboCMsYHe-F-0ts2>*ysB4!wN zXug`Im0Dh9YNcu3<~b3|vqR^RM_Kb)z0dEZzr$yY&-;CjcjIM~2Ze{ZQ~w=2b_aQr zA^-o840f9V`(FQt9imf)&BS|7`3&qa5EIkdXmomZ4ZNS04l`0kkhxkeCi^mDm(f{g z)6fs%8_?PQW$>Zb66POm3xPS#buiaO$~mEB$bFtrU7Tu5%sbIe`rF&3=&E}*u=-*ue0OOD)+pj&ZD2M-_P_TyiLUdkhV_ab z%-8oB!X}}UitKAjJpr3L>|o172EN_ET#fuF2Uf=H)qNfwip=UBKqh~{X&~sOU(LWA{!JonV;k<(> z)_-|9qJLA|IiL~pcizbSYNCvMlX$V&uuyWDSD;8LP`FYd}W=Os4r1KgMeJP z#?TY4rIR={w$M-z$=RTTMl=4@aDk(Wc4EXtU=QX!EE6wBU{mt`Dq&7I6Z& z!7U4JRLnt3#|ah14xvXKwBolyYwKLj&(Gi{Z4wmKBtx6w9056Jn^yogS0_Td>ndoU z83DzS(a<5m4{q_5L&s28xK+9bZaaKLMegThVvTlo*@1SR-vuQ`=A3FFbkWSh?Il_$ zZR~6l` literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Madrid b/usr/share/zoneinfo/Europe/Madrid new file mode 100644 index 0000000000000000000000000000000000000000..60bdf4d07e6ef544ff18013b272dfb851f1cc27c GIT binary patch literal 897 zcmbWzZ%7ky9LMoHb*angHBFbd{F^Roo13%2AW&F~K*xd(692#`2?C8JdsGpVgft|k z)Po@OBtg)0m4;yE1Ggb!EA!8TiNqixq#{EH5ykv{KRxS-&>eR#-uL_dj^m`pt5>SH zeGi^Z&_#!|{}vY;JHRe6!H(P3mmE1T6W%5VWgA-di|C=wHXl77Reblr&)2X%zBq#Q ziIFOFKz3pM+1(uU^PU^4;Et)^}Ie`%^n4DR-O$nJ)ZAy_XhGJb0lNY9a^{2MN0o(Xfl4 zixcG{I_0#w2sA-gqNo?@An+yK+)(L46p8Snfs~4-o!{3#z^k6aIUl~i@ADkSf$=ph z&DYtvOCj%|n-+imk!pFHQoc2(@)D*3P2}s+0|5pXHc81hA12?7v3m0DlN0oP9s_z$ z{Ri~@okQpc>TaTc=hP#AZ7o5+@S~EW^NSyKBDpkRNB$;mAur#*3s>5-nERdnFzpMJ zSutO&@M9iK+ZSja%6o}EwA+P#P31;^X#0%$;rbkY-;u#D(Eg)wFXqR`UgW>8+{h<8 z%kcEks6gM1`9{KoqOlh_LaKqv@`o_;aXb2`g6A+=Z^JxBoeeMOv}bMu0n-4n=M!zgk>yM&y0yB9ghQOhxTCFhS2>{8Y)dTr8o zs8cSUxi<|{wuj;6fCuVlpTX40DUQw?20y_xsSl<<6=6n4H_U8pgIDVA!K+RlX5DhY zY|{;xV=%(p*c51tvWxV7z#EjLh(N?`Hvvsi)1Py8H?kX%IV^n-BCpko~h+Wp_QV^WiywUEhd-MLKfN7{{Zl9 BGR6P^ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Minsk b/usr/share/zoneinfo/Europe/Minsk new file mode 100644 index 0000000000000000000000000000000000000000..30d3a672bf64d0d787ac92bc75d9bc1cc62855c9 GIT binary patch literal 808 zcmWHE%1kq2AP5+NDnJ+nLI`Vd0V?AJVzvK35Vq}<28doIxyk}WZ(Smp0HROD6F zyy64POWt;N0P&^HOa}9%_bm7T;>)a=2&QG{G=XWko?>tsv|@}Km{#&J z2h++n8em#QM-oh{%5Z^c^{)~IAagaIiZ_60&8r+>TI#MKA1L)JzB literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Moscow b/usr/share/zoneinfo/Europe/Moscow new file mode 100644 index 0000000000000000000000000000000000000000..5e6b6de6451b4408fb71ef73950712a0827d49a6 GIT binary patch literal 908 zcmajdT}V@57zgm@xShFX^l`D=a$DNkW>agVF@uYTw)B#{Vp^Ff_g^s%Jj%UfhmShojppzDoJYKKzu?b64|_9x5IOUqcb4-l z3Z!6gRAIBLPUc|9Kf&HHpC}sAp+DwO6Wo88wRVcL$?O?>$F8x=C~UbgpMdi#bFAg- z3cR=G!wToM(^ruzrZNT2w!4GSe*FS;Tsi~So$rE`z58L+;V4`m+XkJ%YPg}+3SBl6 zbeAnakL*eE{+=HeSpB6u#d%}jv!d_k(f7Xi25Tl~U~Tpdth@FUZc0CZo6lyTuWJz2 zADJrfe*V)#upu-8x9sbOjrJ7W>OWNU_c7R1(U;_PO&=r3frSp_?N8juJMux~;Aj|z z9y?(3fD5(^6I8lO;m)+J!29h|XOY9l{~$+PuaVX8C*-Jn54qL(9JzJw72K`M7JWMo z_k13JZTBz3*!1lr?;pQ%3R#QUJ0)F-PG6#z4RWb$FdBr5u4VskFP>;J5IF;Ug1GC6 z>Mu%0@qCV-TZW|N;!7#gY9g?>D4-@p|eEYF&HYd(6+y)s6>Vq;E%U6wc@bvN7a^mq&J@ex>0La+5y~ z*cecGL!2%yqE!fJUJEu4~Q6ZJZCbm*%1#P#i}Nd@Vxmm@7x_oN>Zn zcpL1RXoKBt8rb7^2z2j_lXB#n4b||Lkc0Yd_bJ%xl)*c@4CvoAd_wLku)+Ss$b$0& zaNt`9y!WaiO7{=G9*3bw9~|m$hr>1-JdHeZDGDFdy5PgZWpK2#1U}j#7wG)h z1|#zLrVB7!8bm!jyVOtph>LqiKAGFil9Pcn5Bap&f;@Gu2u?fRw$UJX<1+gUodyzn=2s^$w+ zrM!h{F_R1a7>4Q(J#fVfKTIF>!i>-mOZQ|3yWz^lCb;UX2WB0sgV`=OT)n>%=Gb_s z*=&Vtbj47c$-!Ku8gg=rhwkTo7QwY2wQ$`_70eq`!1cYqpswXJ%s)R1_4SXTp(X^4 zRb9|j_J)n6S>(K|QN>!DsS}id!m568)i8~32&`2Z(8iT=r7z~E%5eAQn zSR@`x4U)2mMB@D@+So*-EE183h4cNpNEhekJHPw??l~v-NbP;SRouUWXDg^^NdIrC zXUh^vG^rc0hb!QuD z)uBa2nWjf#V>42rrMraPI zVA)X;EcbswaXkVn=EBf2aRMuc0?_K&g0{|(z{khMJP9#5_WPgAaf(U$F*YZ#>+AVs tj!PFf1@-t0ms{dmSvecqXp*=l7E;+ug^gOG+it10SVgzZN>jRu%j(UAnxsxp!w;~3O zq5f43Olv$92h*BYIl#2mk)L2%d&?^@t+V7dnAV+g22AU<>;=>MCF{VnLCSnEZ5Vr+ z0R)VE_kd|*+uZ^nhDp#gFl{P37fhQORY2&!^ z(I5viHpmPN;zb|>fFuh8gUTjG4q)IZFz_%iXc;g7t>6=25CMrWN-!{3I55hB#2FQR zd_x$5fY>KEgu&G{guyr1o52}KJG%k}e1lzpfW+Ipe1G3_#$hnA`C5Ag z+xJn(JLsiH-2aF}-j*!CnS1h6SG*~ZlCM`HN6&2~49~AocKHKQ^6?wiNEf9}#EhlEg+ z_AS<#G5^vK!aSV+N22*s$wTx@k=y9M9vnfxZF!CP_VNeZZ-);_w14NV7xP%miyVJ6 zg1o!20QdT4B>MfBe>zGit~@|aay3Kcg&vrE=LY(e(qVX@a~Si~^y|oJw(|)i4yZCZ z(5nJ9$ZAauvifBna>n;Hs2PaEL%}$Du3HB)J*)6=Qw(O=>p8mL5zAjEnOzux+N>3r zqYNhe^$zB)Pr;*$Zm4@d1oM2e9G&N1O~QQF7(6!UgvW38!h()2c%tPhJSm8O63_E>aNin6`Sa;oC9>%(-CZnUimS&0h{l}V9VYFbYE`a{X7f95f&Bw>ywzo z6o0pWUlUzoQADN};xWi1@fUDXEKy@CixX?c*9MtMZjYA=KsBJAWgN;!E+ySR{-=l9*oX}_o6^XdD%9sd2D9RqGX3tIv|K~3chf5pO&NqEQo z^4esj6XdZsriHJuc+JW=nIQA)$i(Pd3;YxgN!bfKC*=Vn_LFX=krlqhM_O0zPD0h% z2uz;shbiN2Fm=!l)4EJB-H`(`%-KQ4D>F|H)k-PMiur;XiN-_wnhzPwxqEX_&b@p^ z)*ju%Jnt>cUpj*YQwOkcWCQB@7GP1gFG%$)IB3xdw-B?)z`>% z)<CmH>7_DHayM1#{D_yxY_d1`%Uvh$WDjKMY-MD>=DF>epILGY(F#U`F0Em`& z#Rry`yzT4&;!B;G4CYJkS?~eGmsv9rOv}z`0@HFm#b8>#CIw6@j}4 zrj>0pz_f~vB$!r};R4fYy?S6;^D0LJ$b79MKf$#2mRDd}XUT0atvlrmgg$ia0s|1} zwX81y(fTC|z_dZiL@;d_y8tY2RJ05v&0uW1TL46x1Wg0erm}Ovw3$%_g#KF(rY)qW zOaQ5~xSI&(TmCKs^R4zegZb9CBfxx{W$|FzcDEInwrg_))AqAvz_de}GMIL3u@nHA z=j6r;<~yfIgZVD1&%u0G=f7aS8|z6h-(C4WnD74X8JPBDJ_w=DodDBbj~9b!?{%xd zw9lFS6F}zs_Vs}Ierpzj`Tlu%V17VPGngM3-UX(Ea#F!`uz6eqNMDGLYyu+_Gb;-a zGP7YoCUy{nh=Z9B0URU;GXsPC50J6)4;Wa0i9~^c0~nPC3_J`Bd;$zW2gxWfiU0%G vfl(49&L|6FGw}HMhA;#Jv8!tcgKw}mgENqJb`1t`T!4Z=1{Y9R*O&_c^%u8U literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Sofia b/usr/share/zoneinfo/Europe/Sofia new file mode 100644 index 0000000000000000000000000000000000000000..89450685cd149950dc6d65d1b4f076d96c3dc9a0 GIT binary patch literal 592 zcmWHE%1kq2AP5+NDnJ+nLI`Wo1uA0$VyXW?5Vq}{3WzQ`{8$1+pLy;r0HV*X6rTX1 z&neE~#^m?}O1(V{wU!F(~{ z0|g+yIL~=7U;Oii1`uE3@j@^yd3h3;mO9)Frlt3+2g))q$gEiare)_$1k-XoO<-ES zrWi~sohdrj>2X!L*8w2AEcrkp$CfJX~N}oz=7f#8Cgrl>nkOp1chJ z(VAD@B!FnGBj>?zV2q=o{nR4)@--=7S|KMCOe@B?foUZlb1bR@yFs*EJaI0iKyE-nynqrgf*B0n>Udd%?7R$vQA?kTM@k8^)ey00E<- zWnkLab}g7T3F-jTrn3ED+RUgz0K_o+TMwo!q^C>(@oh?E5*V48m>F4EnSc}%D;pYQ zXTb(pfFTQtUl0jo%P24cW13HZffvMP5M*G`GGGv8V6bpt1O|ha0i&#sZwNyO5IegD rgNP6YS0MHc_6A}XAR8#i1r*UW0x@-bjrC0R4D^k4d<_l2EE6sO`iG<- literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Tirane b/usr/share/zoneinfo/Europe/Tirane new file mode 100644 index 0000000000000000000000000000000000000000..743a7337ffd8c404d1da0d2d078ea1cd8459affe GIT binary patch literal 604 zcmWHE%1kq2AP5+NDnJ+nLI`UCnaB*py#Ik<+A5O_5Pc%Iy#Pd?dG0L$qR*}rp8%$J zyqo|smqWwy1DJkqmjI% zOWux80P&^HtOv_W@7XH=;>)aA2c~7`%m>qQJrlsRd`%;mR>&y=(~2?4U|Pv11WYU2 zxPoaF9WyYkDx(gj)p#Vpv^uNv1d#daUroTY##2==t$9@pOluuw2h-YHet>D6C6Msb zopKAz*K0Wqru9qqfN6u2wP4yX_ND+M6RD7aL1+fZHGBdLEI>aiFmm|#hA=q0f^cvM b0~e5`YY1ZM_!{e(>KW+x8XACTePb>FP|$Lw literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Ulyanovsk b/usr/share/zoneinfo/Europe/Ulyanovsk new file mode 100644 index 0000000000000000000000000000000000000000..bb842cb1f5087d422630f76f17c3a5eee6490a6b GIT binary patch literal 760 zcmWHE%1kq2AP5+NDnJ+nLI`Vd0xDw%Vv+wqu#myB0YqIERa`d0}st?^X60mRp= z*bkwv`~r(>9eE9=wYS^>(>hDef@$3;`@pnb%X%=aU$Ov98>CDG(}uBoK7hu)cS$4W6TmY;~jWYlM literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Vienna b/usr/share/zoneinfo/Europe/Vienna new file mode 100644 index 0000000000000000000000000000000000000000..75339e98d0a72f2792924294d7a9e560dba4648f GIT binary patch literal 658 zcmWHE%1kq2AP5+NDnJ+nLI`WI04ie!V&4BikiRHiA4JdQ5l;ZqS8sg)(Q|IDn*gHc zF4+pE=k1&Trsuaz2h)oRqy#|ni(R6@{1cpoVEW8+Z?O2;mEvIjxkb)k{`pBJVERIn zDww`lBnF}DUBUF_Wa$YY^R9R+gXyc5hr#04G`E21>pBqoZg5T$0QpncSN#Ks7BRk% z0HQ^eUrzwhV#0U8v^euw2>p2R(O3 zw8m3aFs*r23`}bsWe3yRTYi9Poh2{9wC;e*#o8xQr3cL!`PbwOpN3~ z1_u5>u%8teSr{1j1Qk literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Vilnius b/usr/share/zoneinfo/Europe/Vilnius new file mode 100644 index 0000000000000000000000000000000000000000..43c3d7f1089366e1c48297906c2693712ac6d99c GIT binary patch literal 676 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1}ftOVzvK35Vq}%3y7ZMFCPG+7q)uM0MUy+8hilJ zi_>iMI;SCHxwpa!O2Ll7200R#&02LU37HAnTh=ACP5)2F$4vexO5k^HH-w=jy yAod1gXV(x0S0MHc_6D+pK@1n50Fc226xKBYF?D>6^-T2)^o@0V4Gq976D|N{`JSl& literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Volgograd b/usr/share/zoneinfo/Europe/Volgograd new file mode 100644 index 0000000000000000000000000000000000000000..0715d58bc1873c8bae589a08752cbbae562692c7 GIT binary patch literal 753 zcmWHE%1kq2AP5+NDnJ+nLI`Vd1S(?(Vu}Aiu<)zf9T2^B33mWUzo`1m10Y&V;+z49 z7UwwY0H%L2ZUE5|uNV%1Xvy2AV0o!Ctzf?No=Fct;xcQR!L;n05-=^-lM1HgYr?>^ zLXJC_R*bO#(@H*?U|QKm;{yW_sOU(7X;m36Fs;V@8%(RSsuzId)xS!BY0WEd5;W|9n#dBNHYrAt;OA#L^iTEMk$>@(!jN|a=ce0z*QtNz?kLXBUfw}I zS7nf?9Ob6pN5)<; zimVsCFuU^s%(>qRk2c?cx!2q$=wdk|XdB7!15jxJ?_a(A)+nK8`}y)B;; z_&3Q_9OQpQU`dRbEQ%DWFm1I{V(0m=J8Ec>n1dD$zEJV3*h+QLX)~WPTSTYTLYCN6 F{{iE`PO1O^ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Europe/Zurich b/usr/share/zoneinfo/Europe/Zurich new file mode 100644 index 0000000000000000000000000000000000000000..388df2969f2dc56738183bd4f0d5755c4533a797 GIT binary patch literal 497 zcmWHE%1kq2AP5+NDnJ+nLI`V71uA0!V!{7Fpz`5W1BfoX!qx_&Pl;zSfayntVEXiT zA25C9P%y}N22thL6F{_>@EtHM&U_X^f8GbCB_6K_(~_4LfN8126T!6fp1lGfeKKp- zfoa(}^TD)S&jc_nU(*Pt6>^Hev|>y$m{#%$0n^Ghu3%b4#|%uX%BX{BH695tt)Bq&f=kD2c>UNLD8P-CHGgFOLTq+To!N|l6gbWNpH-HKl zyxl;meIpn+7#N~67^~5w?UK*{(az6b z8-Qq#8$dM39UvOy7BCHT4~T}kiG`Vk8Rn><3m``Uod$Fi&}lqirwM?Z=7HfnE}%hq1{R=M Z2@D)Qz99_S2Btu4#=vC*B<*y~xB&JZ61xBZ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Indian/Maldives b/usr/share/zoneinfo/Indian/Maldives new file mode 100644 index 0000000000000000000000000000000000000000..58a82e4eb701ecb0413f908c57080646be392bba GIT binary patch literal 152 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$VxIp%5Vmc;1c-jCe|QEXP{!p2$P^&S!oc7b Zz`)_-8^YiV#M%a?3|uxq(oWZu3jmj)7K{J@ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Indian/Mauritius b/usr/share/zoneinfo/Indian/Mauritius new file mode 100644 index 0000000000000000000000000000000000000000..7c1113488200c4d45ddb533bbebd899e2073f750 GIT binary patch literal 179 zcmWHE%1kq2AP5+NDnJ+nLI`VN1uA0(VxIp%&{@wq1Ef!a^{oS#zFlMhqCJ_XJpj|^ s`Y$js0wDu~=?jp6TL2>q1A~PF1BZ`q2!pnPDG-}5aM=J!J6#hl0MNJ<_W%F@ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Japan b/usr/share/zoneinfo/Japan deleted file mode 100644 index 5ea81c5328f8eca3455adc230e3eeb267fdef290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmWHE%1kq2zyK^j5fBCeP9O%cc^ZJkbvvel>u)1J-1zaU;O1HD54YJFKHOd_`{B;B zM<4F?{Qtnr$OM5549(0y^$a}=7=fDWCNOY7NFU!21}_&N4h{iHGlFmkVMlNQ)qx%H z1EdQG{sTekp(O<%8ssQ24RjcY200EygB%E=L5>8|K!<{8kYhnK$iWO`xtI&+d|gW} E09+Vl=l}o! diff --git a/usr/share/zoneinfo/London b/usr/share/zoneinfo/London deleted file mode 100644 index 4527515ca3f249a44599be855b3e12800ebe480d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3687 zcmeI!dvwor9LMqBn$hO=nHU-N(OjC={5BD438AqqmtXotj4)(rmX?v0Q>h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx diff --git a/usr/share/zoneinfo/MET b/usr/share/zoneinfo/MET new file mode 100644 index 0000000000000000000000000000000000000000..6f0558c3b6f4ab18385bc549894cc16098eade75 GIT binary patch literal 621 zcmWHE%1kq2AP5+NDnJ+nLI`Uy1uA0#V$T0SFq=m_0Zd=L^#MfBxw&ovh@QJ-E0~_Q za{`#2-!dIcpWrM6(`TN03xL#}T`3OcpIhV%=AWNr0;VrCseR?(ZL;_3;`??5#)QK4X0`og0Mk;3CxU6|J$nT}=E$sB2c~7`%m>qQJrlsRd`%;mR>&y=(~2?4 zU|Pv11WYU2xPoaF9WyYkDx(gj)p#Vpv^uNv1d#daUroTY##2==t$9@pOluuw2h-YH zet>D6B`?9W?vz_#TCe3anAR`Z1Evj9)`Drn*qZ{3z}O`nGVlp7umU}-z{ue18XN*7 cLKwJ!gsvfotK(~|XR2qQ<7;RDqVK*F3009MTi!~g&Q literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/MST7MDT b/usr/share/zoneinfo/MST7MDT new file mode 100644 index 0000000000000000000000000000000000000000..137867c8bf5b2df2e55e8c0c84ecc7deafc3ba79 GIT binary patch literal 951 zcmb`_%TE(g6bInjQY{^;jt>yp;scc0T86ezq4fc13u@9xa17|iG(iY%M2#93z#yn$ zVVvkjC19(G!59_72GT?!Mq}b*Q8%Iqq8k+rF=`^Q(BYonKhTYLa_+g`x#uLaxboqa zCNE37bi9LtmYja1fwviWh#Fu0cLOTrTXCa8IeO6s$8LUuU-p>cM8Tg{x=%!M80CMn zr$x%iuMP0ryLx#3MF38X_+f3pM!&__b*o58cPT}Q>Ceu?87C|X*$~N9DKDy>Qz$R4 zOu|O@By7CwgH7TXYp&B@AZ#A6lcfe~Lo8g@NkV1uAlK@-vcG&W(P^G%{vkA5(GU2@O@9^58 zX?R`iHN5^z9_BZ6K7#WPYH-1^SB%z1-zRv}zK3vO)>GK-RAGDSBMuJXB?h zyyfv7*!8wmp+Zsr1y~xcgNxgnVfVFC*wfrCQlIx!He6EE1eey$!an;Rc&qn4TxN8_ z<<`G^im~!9X4s#cfCJBG;B6n`@b*DLrNfSRAH4I*54fVY1Fk&&2CnMvRj9CQ{~)}( zu?-FuUxh=#BXH>VGf~H1y*`6)|M}CjK9w0X?S53p-!k7bv75s|nS~GVsOM2DGl8Rw T7hT~J$t$^CVUI`hNN!;PA*$7r literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Melbourne b/usr/share/zoneinfo/Melbourne deleted file mode 100644 index ec8dfe038c2d10aed29763ef8f664c8f0cd35c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2223 zcmds%TTGU99LK+}!U#&qa>zjmwG<3Fs2G%z2S7+Ml$T?v1c+h>UqA&b>6eGmMM_$m z%$Oq0=%T`CO>-<_wXs5Ebj^bSvMs!v;XH=7j0d1+xk3v{-0;>p7*_azaM{j zZOsDxgJAawHym;|&y&p^?Q36eZ|{x!dC>o^1_w$4=g$<|P*+CaLPvv!TVete0~r=H zX}W?7Vl4RAbPGwoVIf~cTWI)Y3w`f*3%lBHx1Na7ZC`z>NzKbt zW}oh8+OIofPiksuji&ywPZ8<4inwyZB4<`xdm<~O}*Nj-IzydzU7M+z-fQc53yR8m;LnQU1|ft!>HB!;SM)5Gb;B6*;!P;65u{7H|HP zC@YE!v*PgUR($g(E4g~fN-tlqvf(}}?>lXeoV}<=-x$({why%Ng>G$X>QKej!+NZA zuPSpJRFz(>>i8mUj?7WblsenutF$e@6x!C&EUW!2&9?Q=vB%$;W>1{F#h!d=+@7)@ zY*>25yE9|-YbvD8G*EKQdKX6Gc-@8Auj-B=eNiTLN^zYAW^8H$#oyAe;=QW>? zQ~rP7NvnI!+sQTW8`4cjL&Skd%x*lp?O^uf*=-23Bg~dCd%|prpJP{;Z2|l8>^6qk znP;~(%-%e^&0%(j*&eVzV1vL8fh_`i1U3om64)lNPtR_nz)n58tz!1-*=-iHThDI0 znEhfljM*_}%a}a_o5t)K*fy|lVB^5ffvp33_v|(g?B286KCpkF0hkV8T7c;RrU^h7 zFm1r}0n-RfCorwR^un`i2BsUHT{|%Sz%&HY5uhbNPk^QXT>;tx^aaxxpfi}(V0wdT z4$vLXu0241fCd2_0$K$02xt<}C7?|}pD>NWbPCfdOs_D_!gR~CYZsUB*HECNKudw10!;R6rVgwKoep~M|`Y=C$t_ z!XO(Tu?`y|F$%9Z8DsB;)}@lS%GOdd*5?7$My+!x}&gj>8D09<`Pv|15FL>A4@?IpXeEI7L2eJg{9p$jFh4}?5SSk-{|?L# zV_O2|hyA|*=7&FP1M?&9Zvyipk7a=QQTwNW`O)iJ!F0@u4Pf!u{&X-uu459IAD{0D z<|ky7JYZyEVP;`wW5t9F3>z94fc}eT0FiMX3@rcu7bh@s{r{gDz`)1Au!h*^=&u`b^MgPM&pXdAVoCC+`C zvcm``=uOA5{41PrEJwHt{|M7CV(p{eibm4Z+xxqm)QESkgF4hS$5Ers1p1CDfgU!6 z(IZ)5bWGt#$39H)^!(i)9`xw55c*!K1$}=ujec-*F-^}soP3HN>rSEL!2$I6@lo_d zXE%D%eg*yL@JaL(>q9@b1~~eigp5NcH7C%?@25NH{>4hy{Puuypxu5#|lxYP!VOcfdDJ2@hZqGWf* z#1XifQD+S8f@|L9!Q!rRxHkR~D%*46x~tQ0ee(h=ITL{!bP}EjqjJB1rSkW1Bg=5Y zHrXUol0-UpWk5fl8X~DqO5;i+2a4d2nnW$ zFoQ`(Ovtqukr2`sr|aQqMn=~}Y_&Ov-F1LIu(CLal(trHu)8b{jjfigVRaf?HLGWJ Hl~vNe?I}r+ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Bougainville b/usr/share/zoneinfo/Pacific/Bougainville new file mode 100644 index 0000000000000000000000000000000000000000..7c667093c50d33ce9161662a732fcf6c5092a38b GIT binary patch literal 201 zcmWHE%1kq2AP5+NDnJ+nLI`VN1u6q!(f>dYwk=2lL>IkXG66)NaW+c;(U-JyK7h@e zcfEm;iJ6IofnnkekU-}L1|Yj<0RtxkL)`=hUIvC)8yEzAd_x!le1U|vp#g)ofhCYO OWZ<#^l6Ja=hFky?{3-7M literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Chatham b/usr/share/zoneinfo/Pacific/Chatham new file mode 100644 index 0000000000000000000000000000000000000000..f06065ebd18315683f60cf87839d477a1d699f01 GIT binary patch literal 808 zcmbu-xl0^T90%|>Uf_7F7mGw)vmR0R7wQJAa>;eXql%c_?1YYrH2--=QZTZNiknW0<-&2Tk1@ zFm37!Ojl=N#y~I3w2Z*44{r@0dZ4+|Zg@JZF-o?z#c<~%d?DBj7n)(t?_`+!wG8HM zoI^`*63n03gD;!Tpmk^k7Pu01Mkx&M!XndOSS$$|ZL?P~_2?xjCmK~&@~24WmY!{E z+_J3%oooBKpmFVyLg-i?h0d{fD2?~Q@=vGG)gOfNyB|>L21S=25VAbIjtd91>n)OtTQT!9_=&z?Q(bdl~`kTRh^xCfXu&($x^FPKScZ{+W;6LAHmmo40ZDVO|!4R{{itMG??cuXR iv*?GaQ&y@yUMh5?I)YV_S8|o}El1EJ$+ULUT6_eHWtUF? literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Easter b/usr/share/zoneinfo/Pacific/Easter new file mode 100644 index 0000000000000000000000000000000000000000..54dff005b876339f5c1ff3dc0aeae1519c29b368 GIT binary patch literal 1174 zcmb``Nla5w6b9himPtwl1QAda2M{eoCrUvm&q}2T1(Yg+6cG$k7M2hsCX%Quq`HtH z7(*g)SQtbD4_p8VgcoBRap-~|iNuW|(HI*viX+c^|GG77JTK>+`@M5cy1BKLJ8HFL z*^tl)mMm<`uNi4j0-YtK@iotiry5Uu|BXC$kGaSCV2VNc8#k0AH_)~DiLK7V6XNM!*2jHmr zY&d$z0Iz*f!4VqkI-}v3K_k4r;TOE2Jr<5VEmN_%jZP`NDg7tBx$rH#C29_iGZ2B$ zi2FVX$A9_;Z=JmkCoJBFx80lI+1&P-o3Qf6RXB0P1t+zhg_AGW!ztA@u{0@fVEjOD)wE+<-@7+99XXyh12||F>fHju;FO{`sweK0-=%7{~q4)SOI5Vn1ZwV zJg~8T0M2%~VXou}PuIxKy1TGRdk5ZSxdi8gU4+f*VUCUw^XCRQH?$kh^+;9hyJevn z&Kq~ad)x=%{857Wf}sr9`oJIk!s1qe&?vexfPS%Q7T(*^0q;|O`dr+jF*HISZ%~iGfAbV gnMN~}1ZGkh_4J);OthvatCRI98cm{A_xBX|2T4)%{r~^~ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Efate b/usr/share/zoneinfo/Pacific/Efate new file mode 100644 index 0000000000000000000000000000000000000000..bf7471dd3fc26b7fba883acf0e0bf0a69687b31e GIT binary patch literal 342 zcmWHE%1kq2AP5+NDnJ+nLI`US2P$I*VxIp%FzM@|Eg*gDl`|c{^sh5uTJqBO3n0GK zp<4$)wDhK%V7|~8@eak-{>V7`3y4KQCJd$$8fTrqkVn6KnL7tB|-o&)Bq zXxD@Js?v2}z8ZHTn6LIb0nAr_?F{B?JgK?B00f$ifndJYOAjz#JJHyIi4iMgV3>Ob kq-DhcMivH!SsNHQe0)O~v<;1b*pPwC21wfJ8X9r|0JO|FDgXcg literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Fakaofo b/usr/share/zoneinfo/Pacific/Fakaofo new file mode 100644 index 0000000000000000000000000000000000000000..b7b30213e154012a5275c1384b41dbff29860644 GIT binary patch literal 153 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$VxIp%P-h<60n+F9cjg90rvLxrD;OC5|4$8I hU}0d`c7cJz$2WvQ*U*qb+t8SS%LYi==^7ey0RV5D7HR+h literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Fiji b/usr/share/zoneinfo/Pacific/Fiji new file mode 100644 index 0000000000000000000000000000000000000000..610b850b1dec4966d570eb36f9a8b35fd6aacd68 GIT binary patch literal 396 zcmWHE%1kq2AP5+NDnJ+nLI`V-1uA0(VxIp%FiUvj0U(>f%v$^bn7;li0YqDj8)kGdY<6rf2y)0MQY$Pa$-b9+-~&dmKzhMG1iE=({Vybd2RE zFdcjBSONnO#7SNO^W*QagZT+e9}}1u@jwQK3@kprAq?7vh74Rb LK+;av(2xrNoShE_ literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Guam b/usr/share/zoneinfo/Pacific/Guam new file mode 100644 index 0000000000000000000000000000000000000000..bf9a2d955fc23bb6c2043472e8292d4adc20d4ed GIT binary patch literal 350 zcmWHE%1kq2AP5+NDnJ+nLI`US1uA0$V$uIVAoB3&84z7(rt1TuPn%DD0HQDGb$$TR zZ_M{Gfav#TKfwIovl+nrfA;D>LxI7Ffh#8z{mp@5%BR1VQ>!)VbC_PWN>#0VQ|g>a=1XGuAu=J0D+8M A761SM literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/US/Hawaii b/usr/share/zoneinfo/Pacific/Honolulu similarity index 100% rename from usr/share/zoneinfo/US/Hawaii rename to usr/share/zoneinfo/Pacific/Honolulu diff --git a/usr/share/zoneinfo/Pacific/Kanton b/usr/share/zoneinfo/Pacific/Kanton new file mode 100644 index 0000000000000000000000000000000000000000..2b6a06088ef603f03fb482b628347ff72970fe3d GIT binary patch literal 172 zcmWHE%1kq2AP5+NDnJ+nLI`VN1}b9#VuAlaa9HPd1CY%i6vlD@MC-F!ZeU~rDFK52 t|HB;^SpNS{4PfA4VAytnfk)TCfI-*L2#5_Cv<;0JxNLx=ovxuV7XW_87Tf>; literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Kiritimati b/usr/share/zoneinfo/Pacific/Kiritimati new file mode 100644 index 0000000000000000000000000000000000000000..2f676d3bf5c8599994bcabd402ca30efa4cde5dd GIT binary patch literal 174 zcmWHE%1kq2AP5+NDnJ+nLI`VN1}b9#Vxj*)P-pJZ0Aw==g?<824En6v3mBQ0|NqZv xU|{(FKMSbz|Nr6y1}+AMBM%t(e0)O~bPWwm3_v7%< z556@8^H09wN&xXM3G#u(|F=m8fb28tPIq8rVrF7tW@2Uf|KHsQBsk*?h@7>7frWvg uZUO@b14GXO1|9~66$cmue0)O~v<(dzv<)nQv;hzsF>u)cMeKA94Y>e{!9$S% literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Kwajalein b/usr/share/zoneinfo/Pacific/Kwajalein new file mode 100644 index 0000000000000000000000000000000000000000..9416d522d0a3e19ab6b81317f5b94961c55e91fc GIT binary patch literal 219 zcmWHE%1kq2AP5+NDnJ+nLI`VN11bYyiT^-QXC|Qlq7S|`y#S(5zT!#%(dXS7KY-}} zZPEcCb9Ku292l9H8Ch5v80I_xiOkx-z{0@Lvw(qvfuU{!1JD2e;SLM}3=As{Fo^j0 fhA?Ow8UnEagSLSsgRY?wkZr`kWdkJbfIKb$c@{B1 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Marquesas b/usr/share/zoneinfo/Pacific/Marquesas new file mode 100644 index 0000000000000000000000000000000000000000..6ea24b72cd9552c973510d1c17ace66fd35e1cc5 GIT binary patch literal 139 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;uKz$VCBVmn@&Er?3kHV&|En?>SbTg#7<3IR RjSU#MY{0agrIoP(7XUx`61@Nb literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Nauru b/usr/share/zoneinfo/Pacific/Nauru new file mode 100644 index 0000000000000000000000000000000000000000..ae13aac7792a04fe97b0a746f546e52d32f484c5 GIT binary patch literal 183 zcmWHE%1kq2AP5+NDnJ+nLI`VN0V)Gwq5nXz__;O z7?~Lu=G1`r3wMC@)Jvyq$^g?_pM&Wz z{%2r1R$@~CBNHV9bZEOJwrVM9bXd=rEkmy0OZOh*Z=?k literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Noumea b/usr/share/zoneinfo/Pacific/Noumea new file mode 100644 index 0000000000000000000000000000000000000000..824f814160ee4a95cc6a6d5553b3c1aacc907895 GIT binary patch literal 198 zcmWHE%1kq2AP5+NDnJ+nLI`VN2P$I*VxIp%FzM@&5|BQ=XS)JGG=JFc10Y)9*c>ol z(EPmvh;OvO`vZtJmT)OxVgy45hB-VSp%n)hSr`~*ZD8Q=@eN_nHZ%faLk2DzAZe#- HXvhTsP@Wrk literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/US/Samoa b/usr/share/zoneinfo/Pacific/Pago_Pago similarity index 100% rename from usr/share/zoneinfo/US/Samoa rename to usr/share/zoneinfo/Pacific/Pago_Pago diff --git a/usr/share/zoneinfo/Pacific/Palau b/usr/share/zoneinfo/Pacific/Palau new file mode 100644 index 0000000000000000000000000000000000000000..bc8eb7a55b8a20a8c800507b620d0afef1d477a4 GIT binary patch literal 148 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$VvhenAoB2h4v4NZGke3x^#8xk6p$%(B4Ba? W1B;Ju2!pnPB?FfYkhIgaO%~b! literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Pitcairn b/usr/share/zoneinfo/Pacific/Pitcairn new file mode 100644 index 0000000000000000000000000000000000000000..8a4ba4d30a6b7da8399f20a8b98c91169e04ae40 GIT binary patch literal 153 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$V!r=CP-m|91*Ff^#fgKF>Hq&W9tMX0|2rxe eSpNU-Z(!i^@eN_nHLx%?0Few_HbBzOf(rmy=N5|q literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Port_Moresby b/usr/share/zoneinfo/Pacific/Port_Moresby new file mode 100644 index 0000000000000000000000000000000000000000..5d8fc3a1b253d1df3a0184013469c6e46f6f6f75 GIT binary patch literal 154 zcmWHE%1kq2AP5+NDnJ+nLI`VN0xDw$V&4Bi5VkFf14I|ST{3|YDAV}^WJ>1;1{MZ} do&^k?KE5Fg0lq*&+t7f4%LYi==^7ev0RZ8E7y$qP literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Rarotonga b/usr/share/zoneinfo/Pacific/Rarotonga new file mode 100644 index 0000000000000000000000000000000000000000..7220bda0adb9f04d704cb893a5d1ee8bd9173b82 GIT binary patch literal 406 zcmWHE%1kq2AP5+NDnJ+nLI`V-0V-n!Vv+wqP~&sw1c<)BFyRD9zrY%44G=A8zf}T6 z3sp8MfM{X)>0rJ{WHOj9^1l+y7qfH)^Tl3FodHrOp_I4)OrIzR^QD-a!F;I|kzl^` zBULb8ro$S{mp#M|=F4Tsg8A|bUxN7x?*GAj#m3WMzLKGg1OpH#XT4AW(JBJ}zt-9Wiayj c_=Yg(8X6cIfJg>i14|%_%Ld4{Gc@1=03*mq1poj5 literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Pacific/Tahiti b/usr/share/zoneinfo/Pacific/Tahiti new file mode 100644 index 0000000000000000000000000000000000000000..50a064fa0166a0dc22f89cdadf957a545d3f6544 GIT binary patch literal 133 zcmWHE%1kq2AP5+NDnJ+nLI`UCDP;m;j{iU~B_MPM~sx{xd3&SC+7eF literal 0 HcmV?d00001 diff --git a/usr/share/zoneinfo/Sydney b/usr/share/zoneinfo/Sydney deleted file mode 100644 index f4343b326cbc2b40a073d7c450f0d32d75e962fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2221 zcmc(fTTGXA9EU&ulo6zoNYcp>`oN zW=J!-s4!a79E&J7RtT&vI*_Jx)37$yP07sc_q-N2U9_%z{(Il&-MjbwU%j6vuehpm zq5j20cZUO-+`;t}bElTIpIS>-oci)UP+xC_ojX-v{p}ex&|0U##%S|hdh61J>SUWZ zdAj^^BFyi%B=e8EX8vD?TR_l73;6I43momS+ujJ%q;G%F*9(k84_CrKbJ4Pr*r<3Yqk>h0ZFs(B2m;+?Q_Q?PV4*9A(oR(`-ghphfO# zvAd3RYGzS`&9VWTz4CR>%ZArqIEx9I3iU?NH`5!I0 zeZ=nXI%^LM4JqZsu$G?b(y|vn(}PEkX?ev7t=MU>*Ql5XpB?z7zGQI;1U zX8AJ%tsv;C6}k7f z+p52}>aG5&DY~NCtP#~E59yicK5Y-{(vE<4wPWmKz z`FuR2y#F4_LHC$9k}KXD(sf5&@SYURXgs^&V8-Lw4G1$L%#bi+!VHSPV^o-7Va5dv z%(ELAW@w(>*f4|h>_&$f9%g*N0D%z#Lj=YM3=$Y6Fic>az(75_kpe>n#)=uNXE$2R za6P;6Vg`&EF=oh^F=GY|j2bg+%(#Jp10x59?%9nU7`$gUdSLjT-S~k301?21022dD z5HL}|gaH!=Odv3kz=Q%53rsLPyJ%p-;n~Fl6A(;9Fd+eA0t5w!3J?|`E@*JiB;d0)~kg zCS;hHVS)xk4G0?$Hz068*n!L=Olb5I;-+J-Y~ELWqeWCWx3QV#0`tBPNiT zNMb?>#1aT55KSPQKs7LJGtb2r3X&Agq|UVgieaEGD!X5A68GO)2c(x%d6Q c(gxDq1qtyqI3_zGJ~kmXJ|=rHidz);7cV6OegFUf diff --git a/usr/share/zoneinfo/WET b/usr/share/zoneinfo/WET new file mode 100644 index 0000000000000000000000000000000000000000..423c6c203a508a162f86fbe44822b78213b575ff GIT binary patch literal 494 zcmWHE%1kq2AP5+NDnJ+nLI`V72P$I%Vos2H-X+NsKr~;slmLk4Z*c|l1xn1ov|x%l zm=+3=0Mo+0E&?ERBF4YKd{O1sU|LN04wx2aJ`15g?*r2kkJp1~$;%7CwAA5=U|M?5 zUICCfGHcd>Y1ujR!L(e@1TZaM(+H*&a*DvTVoWlaR`Lk})5